C#数据库查询

C#数据库查询,第1张

//建立和数据库的连接

string

connectionstring=

stringformat("data

source={0};initial

catalog={1};persist

security

info=true;user

id={2};password={3};",

sdatabaseip,sdatabasename,sdatabaseusername,

sdatabasepwd);

sqlconnection

cnn

=

new

sqlconnection(connectionstring);

cnnopen();

string

sql

=

"你的查询语句";

sqlcommand

cmd

=

new

sqlcommand(sql,cnn);

sqldataadapter

da=

new

sqldataadapter(cmd);

dataset

ds

=

new

dataset();

dafill(ds);

datatable

dt

=

dstables[0];//结果在这个table里,把它作为数据源就好了

cnnclose();

using System;

using SystemCollectionsGeneric;

using SystemComponentModel;

using SystemData;

using SystemDrawing;

using SystemText;

using SystemWindowsForms;

//引用命名空间

using SystemDataOleDb;

namespace 代码绑定

{

public partial class Form1 : Form

{

//添加绑定对象,就是前面学过的Adonet对象

OleDbDataAdapter da;//数据适配器

DataSet ds;//数据集

OleDbCommandBuilder DCB;//命令管理器

BindingSource bs;//绑定源对象

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

//连接字符串

string strCon = "Provider=Microsoftjetoledb40;data source=" + AppDomainCurrentDomainBaseDirectory + "studentmdb; ";

//添加查询语句

string StrSelect = "select 学号,姓名,性别 from dzsw1";

//初始化数据适配器及数据集

da = new OleDbDataAdapter(StrSelect ,strCon);

ds = new DataSet();

//填充数据到数据集

daFill(ds, "dzsw");

DCB = new OleDbCommandBuilder(da);

//初始化绑定源对象

bs = new BindingSource();

bsDataSource  = dsTables[0] ;

//绑定DataGridView

dataGridView1DataSource = bs;

//绑定 文本框

textBox1DataBindingsAdd("Text", bs, "姓名");

//绑定 列表框

listBox1DataSource = bs;

listBox1DisplayMember = "姓名";

//绑定组合框

comboBox1DataSource = bs;

comboBox1DisplayMember = "姓名";

}

private void button2_Click(object sender, EventArgs e)

{

//指针后移

bsPosition++;

}

private void button1_Click(object sender, EventArgs e)

{

//指针前移

bsPosition--;

}

private void button3_Click(object sender, EventArgs e)

{

//更新数据

daUpdate(dsTables[0]);

}

}

}

这样就可以了。\x0d\EXEC SP_ATTACH_DB 数据库名称 'mdf'(数据库文件地址), 'ldf(日志文件地址)\x0d\你的就是这样了:\x0d\EXEC SP_ATTACH_DB data, 'D:\datamdf','D\dataldf'

前期准备工作,安好JDK,MyEclipse。

下载JDBC驱动mysql-connector-java-505-binjar导入到工程中去

1、工程(右键)--buildpath--configure build path--add external jars。

2、 也可以加到classpath中去,具体如下:“我的电脑”-> “属性” ->“高级” -> “环境变量”,在系统变量那里编辑classpath,将D:\mysql-connector-java-505\mysql- connector-java-505-binjar加到最后,在加这个字符串前要加“;”,以与前一个classpath区分开,然后确定。

测试代码:所用驱动 mysql-connector-java-50-nightly-20071116-binjar

程序中引用必要的包:import javasql;  //它包含有 *** 作数据库的各个类与接口

1、加载合适的JDBC驱动程序

ClassforName(Driver);

   MySQL驱动程序:commysqljdbcDriver

   Oracle驱动程序:oraclejdbcdriverOracleDriver

   SQLServer驱动程序:

   comMicrosoftjdbcsqlserverSQLServerDriver

2、建立数据库连接

与MySQL数据库连接的方法:

Connection con=DriverManagergetConnection(“jdbc:mysql://主机IP或主机名:3306/数据库名”,用户名,密码);

javasqlDriveManager  用来处理装载驱动程序并且为创建新的数据库连接提供支持;

–javasqlConnection  用于完成对特定定数据库的连接;

–javasqlStatement  用于对特定的数据库执行SQL语句;javasqlStatement又包含了以下两个重要的子类型:

       javasqlPreparedStatement  用于执行预编译的SQL语句;

       javasqlCallableStatement  用于执行数据库中存储的过程的调用;

--javasqlResultSet  用于保存查询所得的结果集

3、创建Statement对象

Statement  st=concreateStatement();  //最后可以不关闭,但推荐关闭

利用Statement对象可以执行静态SQL语句,静态SQL语句可以是Select语句、Delete语句、Update语句和Insert语句。

执行SQL语句

Statement接口提供了三种执行SQL语句的方法:executeQuery()、executeUpdate() 和execute()。具体使用哪一个方法由SQL语句本身来决定。

方法 executeQuery 用于产生单个结果集的语句,例如 SELECT 语句等。

方法 executeUpdate 用于执行INSERT、UPDATE或DELETE 语句以及SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个 整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或DROP TABLE 等不 *** 作行的语句,executeUpdate 的返回值总为零。

方法 execute 用于执行返回多个结果集、多个更新计数或二者组合的语句。一般不会需要该高级功能。

      ①JDBC在编译时并不对将要执行的SQL查询语句作任何检查,只是将其作为一个String类对象,直到驱动程序执行SQL查询语句时才知道其是否正确。对于错误的SQL查询语句,在执行时将会产生 SQLException。

      ②一个Statement对象在同一时间只能打开一个结果集,对第二个结果集的打开隐含着对第一个结果集的关闭。

      ③如果想对多个结果集同时 *** 作,必须创建出多个Statement对象,在每个Statement对象上执行SQL查询语句以获得相应的结果集。

      ④如果不需要同时处理多个结果集,则可以在一个Statement对象上顺序执行多个SQL查询语句,对获得的结果集进行顺序 *** 作。

str="insertinto customer values('wangyang',24,'beijing','wangyang@sinacom')";

int  recordNumber=stexecuteUpdate(str);执行executeUpdate()方法返回该SQL语句涉及的记录数。

str="select from mycustomer";   //查询表中记录

ResultSet rs=stexecuteQuery(str); 由于SQL语句是select,用executeQuery()方法,返回一个结果集保存在ResultSet对象rs中。

4、分析ResultSet对象

① 执行完毕SQL语句后,将返回一个ResultSet类的对象,它包含所有的查询结果。但对ResultSet类的对象方式依赖于光标(Cursor)的 类型,而对每一行中的各个列,可以按任何顺序进行处理(当然,如果按从左到右的顺序对各列进行处理可以获得较高的执行效率);

ResultSet类中的Course方式主要有:

ResultSetTYPE_FORWARD_ONLY(为缺省设置):光标只能前进不能后退,也就是只能从第一个一直移动到最后一个。

ResultSetTYPE_SCROLL_SENSITIVE:允许光标前进或后退并感应到其它ResultSet的光标的移动情形。

ResultSetTYPE_SCROLL_INSENSITIVE:允许光标前进或后退并不能感应到其它ResultSet的光标的移动情形。

ResultSet类中的数据是否允许修改主要有:

ResultSetCONCUR_READ_ONLY(为缺省设置):表示数据只能只读,不能更改。

ResultSetCONCUR_UPDATABLE:表示数据允许被修改。

可以在创建Statement或PreparedStatement对象时指定ResultSet的这两个特性。

Statement stmt=concreateStatement(ResultSetTYPE_FORWARD_ONLY,ResultSetCONCUR_READ_ONLY);

PreparedStatement pstmt=conPrepareStatement("insert into bookTable values (,,)",ResultSetTYPE_SCROLL_INSENSITIVE,ResultSetCONCUR_UPDATABLE);

② ResultSet类的对象维持一个指向当前行的指针,利用ResultSet类的next()方法可以移动到下一行(在JDBC中,Java程序一次只 能看到一行数据),如果next()的返回值为false,则说明已到记录集的尾部。另外JDBC也没有类似ODBC 的书签功能的方法。

③ 利用ResultSet类的getXXX()方法可以获得某一列的结果,其中XXX代表JDBC中的Java数据类型,如 getInt()、getString()、getDate()等。访问时需要指定要检索的列(可以采用 int值作为列号(从1开始计数)或指定列(字段)名方式,但字段名不区别字母的大小写)。

示例:

while(rsnext()){

int id=rsgetInt("id");

String name=rsgetString("cName");

int age=rsgetInt("cAge");

String address=rsgetString("cAddress");

String email=rsgetString("cEmail");

Systemoutprintln(id+" "+name+" "+age+" "+address+" "+email);

}

获得结果集中的结构信息:利用ResultSet类的getMetaData()方法来获得结果集中的一些结构信息(主要提供用来描述列的数量、列的名称、列的数据类型。利用ResulSetMetaData类中的方法)。

ResultsetMetaData  rsmd=rsgetMetaData();

rsmdgetColumnCount();   //返回结果集中的列数

rsmdgetColumnLabel(1); //返回第一列的列名(字段名)

例如:

Statement stmt=concreateStatement();

ResultSet rs=stmtexecuteQuery("select  from TableName");

for(int i=1; i<=rsgetMetaData()getColumnCount(); i++) //跟踪显示各个列的名称

{ Systemoutprint(rs getColumnName (i)+"\t");

}

while(rsnext())

{ //跟踪显示各个列的值

for(int j=1; j<=rsgetMetaData()getColumnCount(); j++)

{ Systemoutprint(rsgetObject(j)+"\t");

}

}

5、关闭连接

(注意关闭的顺序) 例:

rsclose();

stclose();

conclose()

6、JDBC的常用API

一、Connection接口:

       1createStatement():创建数据库连接

       2prepareStatement(Stringsql):创建预处理语句

       3prepareCall(Stringsql):创建可调用语句

       4getAutoCommit():获取自动提交的模式

       5setAutoCommit():设置自动提交的模式

       6commit():提交所执行的SQL语句

       7rollback():回滚所执行的SQL语句

       8getMetaData():获取一个DatabaseMetaData对象,该对象包含了有关数据库的基本信息

       9close():关闭数据库连接

      10isClose():判断数据库连接是否超时或被显示关闭

二、Statement接口:

       1execute(Stringsql):执行SQL语句,如果返回值是结果集则为true,否则为false

       2executeQuery(Stringsql):执行SQL语句,返回值为ResultSet

       3executeUpdate(Stringsql):执行SQL语句,返回值为所影响的行数

       4addBatch(Stringsql):向当前Statement对象的命令列表中添加新的批处理SQL语句

       5clearBatch():清空当前Statement对象的命令列表

       6executeBatch():执行当前Statement对象的批处理语句,返回值为每个语句所影响的函数数组

       7getConnection():返回创建了该Statement对象的Connection对象

       8getQueryTimeout():获取等待处理结果的时间

       9setQueryTimeout():设置等待处理结果的时间

三、ResultSet接口:

       1first()/beforeFirst():将游标移动到ResultSet中第一条记录(的前面)

       2last()/afterLast():将游标移动到ResultSet中最后一条记录(的后面)

       3absolute(intcolumn):将游标移动到相对于第一行的指定行,负数则为相对于最后一条记录

       4relative(introws):将游标移动到相对于当前行的第几行,正为向下,负为向上

       5next():将游标下移一行

       6previous():将游标上移一行

       7insertRow():向当前ResultSet和数据库中被插入行处插入一条记录

       8deleteRow():将当前ResultSet中的当前行和数据库中对应的记录删除

       9updateRow():用当前ResultSet中已更新的记录更新数据库中对应的记录

       10cancelUpdate():取消当前对ResultSet和数据库中所做的 *** 作

       11findColumn(StringcolumnName):返回当前ResultSet中与指定列名对应的索引

       12getRow():返回ResultSet中的当前行号

       13refreshRow():更新当前ResultSet中的所有记录

       14getMetaData():返回描述ResultSet的ResultSetMetaData对象

       15isAfterLast():是否到了结尾

       16isBeforeFirst(): 是否到了开头

       17isFirst():是否第一条记录

       18isLast(): 是否最后一条记录

       19wasNull():检查列值是否为NULL值,如果列的类型为基本类型,且数据库中的值为0,那么

这项检查就很重要。由于数据库NULL也返回0,所以0值和数据库的NULL不能区分。如果列的类型为对象,可以简单地将返回值与null比较

        20close():关闭当前ResultSet

四、ResultSetMetaData接口:

       1getColumnCount():返回ResultSet中列的数目

       2getColumnName():返回列在数据库中的名称

       3getColumnType():返回列的SQL类型

       4isReadOnly():表示该数据项是否为只读值

       5isNullable():表示该列是否可以存储NULL

示例:

import javasql;

public class JDBCTest {

public static void main(String[] args){

           // 驱动程序名

           String driver = "commysqljdbcDriver";

           // URL指向要访问的数据库名scutcs

           String url = "jdbc:mysql://127001:3306/test";

           // MySQL配置时的用户名

           String user = "root";

 

           // MySQL配置时的密码

           String password = "123456";

           try {

            // 加载驱动程序

            ClassforName(driver);

            // 连续数据库

            Connection conn = DriverManagergetConnection(url, user, password);

            if(!connisClosed())

             Systemoutprintln("Succeeded connecting to the Database!");

            // statement用来执行SQL语句

            Statement statement = conncreateStatement();

            // 要执行的SQL语句

            String sql = "select  from pet";

            // 结果集

            ResultSet rs = statementexecuteQuery(sql);

            Systemoutprintln("-----------------");

           

            String name = null;

            while(rsnext()) {

   

             // 选择sname这列数据

             name = rsgetString("name");

   

             // 首先使用ISO-8859-1字符集将name解码为字节序列并将结果存储新的字节数组中。

             // 然后使用GB2312字符集解码指定的字节数组

             name = new String(namegetBytes("ISO-8859-1"),"GB2312");

             // 输出结果

             Systemoutprintln(rsgetString("ID") + "\t" + name);

            }

            rsclose();

            connclose();

           } catch(ClassNotFoundException e) {

            Systemoutprintln("Sorry,can`t find the Driver!");

            eprintStackTrace();

           } catch(SQLException e) {

            eprintStackTrace();

           } catch(Exception e) {

            eprintStackTrace();

           }

}

}

第一种方法:直接通过数据库的用户名、密码等连接到数据库进行数据库连接。

如:private void sqlconn()

{

SqlConncetion conn = new SqlConnection("SERVER=;DATABASE=pubs;PWD=;UID=sa;");

SqlConncetion cmd = new SqlCommand("SELECTFROM [table]",cmd);

DataSet ds = new DataSet();

SqlDataAdapter adp = new SqlDataAdapter(cmd);

adpFill(ds);

}

其中SqlConnection 是数据库连接类,SqlDataAdapter是数据适配器,SqlCommand是数据 *** 作命令,即执行SQL语言。

说明,使用SqlConnection进行数据库的连接,然后使用SqlCommand定义SQL查询语句,再定义一个DataSet存储查询的结果,而SqlDataAdapter是数据库和DataSet的转换桥梁。

第二种方法:通过ConfigurationManagerConnectionString获取数据库的配置信息。进行数据库的连接。

如:public static int ExcuteNonQuery(string sql,params SqlParameter[] parameters)

{

string connStr = configurationManagerConnectionStrings["ConnStr"]ConncetionString;

using(SqlConncetion conn=new SqlConnection(connStr))

{

connopen();

using(SqlCommand cmd = connCreateCommand())

{

cmdCommandText = sql;

foreach(SqlParameter parameter in parameters)

{

cmdParametersAdd(parameter);

}

return cmdExecuteNonQuery();

}

}

}

说明:

(1) 通过string connStr=ConfigurationManagerConnectionString[“ConnStr”]ConnectionString;获得数据库连接的一些配置信息,即“数据源”、“数据库名”、“用户名”、“密码”,将这些信息都保存在connStr中。

(2) SqlConnection conn = new SqlConnection(connStr);创建一个数据库连接对象conn,连接数据库用connOpen();

(3) SqlCommand cmd = new SqlCommand(“Select Form [表]”,conn);

或者string sql = “Select From [表]”;

SqlCommand cmd = connCreateCommand();

cmdCommandText = sql;这样就把访问数据库的SQL语句存到了cmd中

(4) 建立SqlDataAdapter对象和DataSet对象

DataSet myDataSet = new DataSet();创建DataSet对象,

SqlDataAdapter myDataAdapter = new SqlDataAdapter(cmd);创建数据适配器对象。

(5) 填充DataSet:myDataAdapterFill(myDataSet);其实SqlDataAdapter数据适配器起的就是一个连接数据库和数据集(DataSet)的桥梁作用,把对数据库 *** 作的SQL语句得到的结果传到SqlDataAdapter对象中,在通过SqlDataAdapterFill(DataSet)方法,将结果填充到DataSet中。

第三种方法:用工厂方法

DbProviderFactory m_dbProviderFactory = DbProviderFactoriesGetFacory(ConfigurationManagerConnectionString[“ConStr”]ProviderName);//获取工厂

DbConnection conn = m_dbProviderFactoryCreateConncetion();//创建连接

DbCommand cmd = m_dbProviderFactoryCreateCommand();//创建命令

cmdConnection = conn;

cmdCommandText = strSql;

cmdCommandType = CommandTypeText;

DbDataAdapter dapter = m_dbProviderFactoryCreateDataAdapter();//创建适配器

dapterSelectCommand = cmd;

dapterFill(DataSet ds = new DataSet());//填充

return ds;

说明:

上面的语句中用ConfigurationManagerConnectionString[“ConStr”]ProviderName获取了当前数据库的名称,因此可以适用于任何数据库,如果这样写,就是不同的数据库使用不同的语言:

SqlServer:DbProviderFactory factory = DbProviderFactoriesGetFactory("SystemDataSqlClient");

Oracle:DbProviderFactory factory = DbProviderFactoriesGetFactory("SystemDataOracleClient");

ODBC:DbProviderFactory factory = DbProviderFactoriesGetFactory("SystemDataOdbc");

Access:DbProviderFactory factory = DbProviderFactoriesGetFactory("SystemDataOleDb");

连接数据库 ThinkPHP内置了抽象数据库访问层,把不同的数据库 *** 作封装起来,我们只需要使用公共的Db类进行 *** 作,而无需针对不同的数据库写不同的代码和底层实现,Db类会自动调用相应的数据库适配器来处理。目前的数据库包括Mysql、MsSQL、PgSQL、Sqlite、Oracle、Ibase以及PDO的支持,如果应用需要使用数据库,必须配置数据库连接信息,数据库的配置文件有多种定义方式:

第一种 在项目配置文件里面定义

return array(

'DB_TYPE'=> 'mysql',

'DB_HOST'=> 'localhost',

'DB_NAME'=>'thinkphp',

'DB_USER'=>'root',

'DB_PWD'=>'',

'DB_PORT'=>'3306',

'DB_PREFIX'=>'think_',

// 其他项目配置参数………

);

系统推荐使用该种方式,因为一般一个项目的数据库访问配置是相同的。该方法系统在连接数据库的时候会自动获取,无需手动连接。

可以对每个项目定义不同的数据库连接信息,还可以在调试配置文件(Conf/debugphp)里面定义调试数据库的配置信息,如果在项目配置文件和调试模式配置文件里面同时定义了数据库连接信息,那么在调试模式下面后者生效,部署模式下面前者生效。

第二种 使用DSN方式在初始化Db类的时候传参数

$db_dsn = “mysql://username:passwd@localhost:3306/DbName”;

$db = new Db($db_dsn);

该方式主要用于在控制器里面自己手动连接数据库的情况,或者用于创建多个数据库连接。

第三种 使用数组传参数

$DSN = array(

'dbms' => 'mysql',

'username' => 'username',

'password' => 'password',

'hostname' => ; 'localhost',

'hostport' => '3306',

'database' => 'dbname'

);

$db = new Db($DSN);

该方式也是用于手动连接数据库的情况,或者用于创建多个数据库连接。

第四种 在模型类里面定义

protected $connection = array(

'dbms' => 'mysql',

'username' => 'username',

'password' => 'password',

'hostname' => 'localhost',

'hostport' => '3306',

'database' => 'dbname'

);

// 或者使用下面的定义

protected $connection = ”mysql://username:passwd@localhost:3306/DbName”;

如果在某个模型类里面定义了connection属性,则在实例化模型对象的时候,会使用该数据库连接信息进行数据库连接。通常用于某些数据表位于当前数据库连接之外的其它数据库。

ThinkPHP并不是在一开始就会连接数据库,而是在有数据查询 *** 作的时候才会去连接数据库。额外的情况是,在系统第一次 *** 作模型的时候,框架会自动连接数据库获取相关模型类的数据字段信息,并缓存下来。

(字段缓存目录:Runtime/Data/_fields)

ThinkPHP支持PDO方式,如果要使用PDO方式连接数据库,可以参考下面的设置。

我们以项目配置文件定义为例来说明:

return array(

'DB_TYPE'=> 'pdo',

// 注意DSN的配置针对不同的数据库有所区别 请参考PHP手册PDO类库部分

'DB_DSN'=> 'mysql:host=localhost;dbname=think',

'DB_USER'=>'root',

'DB_PWD'=>'',

'DB_PREFIX'=>'think_',

// 其他项目配置参数………

);

使用PDO方式的时候,要注意检查是否开启相关的PDO模块。DB_DSN参数仅对PDO方式连接才有效。

以上就是关于C#数据库查询全部的内容,包括:C#数据库查询、C# 如何实现用Table显示数据库表格中的数据(代码+相关 *** 作)非常感谢!、在sql server中附加数据库的代码怎么写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10632914.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存