当前位置: 移动技术网 > IT编程>开发语言>c# > C#连接数据库的方法

C#连接数据库的方法

2019年07月18日  | 移动技术网IT编程  | 我要评论
以下内容给大家c#连接数据库的方法的相关介绍,本文非常具有参考借鉴价值,具体详情如下所示。 asp.net连接数据库的技术叫ado.net,它是用来向数据库提交sql语句

以下内容给大家c#连接数据库的方法的相关介绍,本文非常具有参考借鉴价值,具体详情如下所示。

asp.net连接数据库的技术叫ado.net,它是用来向数据库提交sql语句的一堆类。这里连接的是sql server 2008数据库,其他数据库用法差不多,就是调用的类名不一样。

    首先在web.config(本地的添加应用程序配置文件app.config,本地还要添加system.configuration.dll程序集)上配置数据库连接字符串,添加如下节点代码:

<connectionstrings>
 <add name="connstr" connectionstring="data source=.;initial catalog=milk ;user id=sa;password=521521521;"></add>
 </connectionstrings>

    name是链接字符串名称,可以随便取。connectionstring是链接字符串。data source数据库所在服务器ip地址,这里是本地写“.”。 initial catalog是数据库名称。user id是数据库用户,其中sa是最高权限管理员账户,需要谨慎使用,而是针对数据库建立数据库的专用受限账户。password是密码。

    程序使用数据库时,先提取配置文件的连接字符串赋值给一个变量。代码如下:

public static readonly string connstr =
configurationmanager.connectionstrings["connstr"].connectionstring;

configurationmanager是静态类,提供对客户端应用程序配置文件的访问。

    接着打开数据库连接,使用完毕后用using自动释放连接:

sqlconnection是个密封类,表示 sql server 数据库的一个打开的连接。接着是执行sql语句,先定义向数据库发送指令用到的sqlcommand类,定义之后确定语句执行的连接对象是conn,再确定要执行的sql语句,用法举例如下:

//sqlconnection为建立和数据库连接的对象
using(sqlconnection conn = new sqlconnection(connstr))
{
conn.open();//打开连接
//通过连接创建一个向数据库发命令(command)的对象sqlcommand
using(sqlcommand cmd = conn.createcommand())
{
cmd.commandtext =”insert into t_student*(name,age) values(‘xxx',18)”;// commandtext要执行的sql语句
cmd.executenonquery();//执行
}
}

executenonquery()一般用来执行update、delete、insert语句

对于一种一行、一列返回值的结果执行用executescalar(),它返回object类型。举例如下:

using(sqlconnection conn = new sqlconnection(connstr))
{
conn.open();//打开连接
//通过连接创建一个向数据库发命令(command)的对象sqlcommand
using(sqlcommand cmd = conn.createcommand())
{
cmd.commandtext =”select name from t_student where name=”xxx””;// commandtext要执行的sql语句
cmd.executescalar();//执行
}
}

返回值有多行结果时要用executereader(),返回类型sqldatareader,需要释放,用法举例:

using(sqlconnection conn = new sqlconnection(connstr))
{
conn.open();//打开连接
//通过连接创建一个向数据库发命令(command)的对象sqlcommand
using(sqlcommand cmd = conn.createcommand())
{
cmd.commandtext =”select * from t_student where age<18”;
using(sqldatareader reader=cmd.executereader()
{
  while(reader.read())
{
 string name=reader.getstring(1);//获得第一列列的值
 int age=reader.getin32(2); //获得第2列列的值
 console.writeline(name);
 console.writeline(age.tostring());
}
}
}
}

  其中read方法返回bool类型,查询结果是放到数据库中,没有放到客户端。初始指针指向第一条数据之前,每调用一次reader指针下移一条,只要没有移到最后一条之后,就直接返回true。reader的getstring\getint32等方法只接受整数参数,也就是序号,用getordinal方法根据列名动态得到序号。

0列

第一列

第二列

第三列

id

name

age

hobby

1

xxx

18

勾搭妹子

2

王旭

30

勾搭妹子

图 1   数据库t_student表

为了避免数据库注入漏洞,微软设置有查询参数,举例如下:

cmd.commandtext =”select * from t_student where age<@age”;

cmd.parameters.add(new sqlparameter(“@age”,19));

这里把@age设置为查询参数,但是@参数不能用了替换表名、字段名、select之类的关键字等。

    sqldatareader是和连接相关的,sqldatareader中的查询结果并不是放在程序中的,而是放在数据库服务器中,sqldatareader只是相当于一个游标,指到哪里读到哪里。

    ado.net提供了数据集机制,dataset,存在本地内存,其包含若干datatable,datatable包含若干行datarow。使用方法:

dataset dataset=new dataset();
sqldataadapter adapter=new sqldataadapter(cmd);
adapter.fill(dataset);

sqldataadapter是一个帮我们把sqlcommand查询结果填充到dataset中的类,dataset相当于本地的list集合(小数据库)。遍历方法如下:

datatable table=dataset.tables[0];//一般情况下只有一个tables,当同时执行多个select语句时有多个tables。

datarowcollection rows=table.rows;
for(int i=0;i<rows.count;i++)
{
  datarow row=rows[i];
int age=(int)row[“age”];//遍历年龄
}

基本上所有的步骤都是:打开链接--创建命令--执行--处理执行结果。所以可以写个公共类自己用,避免重复代码,详细代码如下:

public static class sqlhelper
  {
    public static readonly string connstr =
      configurationmanager.connectionstrings["connstr"].connectionstring;
    public static sqlconnection openconnection()//建立连接
    {
      sqlconnection conn = new sqlconnection(connstr);
      conn.open();
      return conn;
    }
    public static int executenonquery(string cmdtext,
      params sqlparameter[] parameters)//注意看有使用长度可变参数进行了简化
    {
      using (sqlconnection conn = new sqlconnection(connstr))
      {
        conn.open();
        return executenonquery(conn, cmdtext, parameters);
      }
    }
    public static object executescalar(string cmdtext,
      params sqlparameter[] parameters)
    {
      using (sqlconnection conn = new sqlconnection(connstr))
      {
        conn.open();
        return executescalar(conn, cmdtext, parameters);
      }
    }
    public static datatable executedatatable(string cmdtext,
      params sqlparameter[] parameters)
    {
      using (sqlconnection conn = new sqlconnection(connstr))
      {
        conn.open();
        return executedatatable(conn, cmdtext, parameters);
      }
    }
    public static int executenonquery(sqlconnection conn,string cmdtext,
      params sqlparameter[] parameters)
    {
      using (sqlcommand cmd = conn.createcommand())
      {
        cmd.commandtext = cmdtext;
        cmd.parameters.addrange(parameters);
        return cmd.executenonquery();//返回执行了多少行
      }
    }
    public static object executescalar(sqlconnection conn, string cmdtext,
      params sqlparameter[] parameters)
    {
      using (sqlcommand cmd = conn.createcommand())
      {
        cmd.commandtext = cmdtext;
        cmd.parameters.addrange(parameters);
        return cmd.executescalar();
      }
    }
    public static datatable executedatatable(sqlconnection conn, string cmdtext,
      params sqlparameter[] parameters)
    {
      using (sqlcommand cmd = conn.createcommand())
      {
        cmd.commandtext = cmdtext;
        cmd.parameters.addrange(parameters);
        using (sqldataadapter adapter = new sqldataadapter(cmd))
        {
          datatable dt = new datatable();
          adapter.fill(dt);
          return dt;
        }
      }
    }
    public static object todbvalue(this object value)
    {
      return value == null ? dbnull.value : value;
    }
    public static object fromdbvalue(this object dbvalue)
    {
      return dbvalue == dbnull.value ? null : dbvalue;
    }
  }

封装方法的原则:把不变的放到方法里,把变化的放到参数里,sqlhelper类里返回值是一行一列的用executescaler,executenonquery一般用来执行update\delete\insert语句,executedatatable只用来执行查询结果比较少的sql,返回值是datatable。

在数据库中null和“”不一样,null和0也不一样。数据库中null表示不“知道”。假如一个表中有个可空字段name,如果有几个实例name为null,

select * from t_student where name=null是查不到任何数据的。
select * from t_student where name is null可以查到所有name填null的数据。

需求:如果没输入姓名,则姓名应该为null,如果没输入年龄,则年龄应该为null。

问题:在sqlparameter如果参数值为null,则表示没有提供参数的值,会报错。

解决方法:.net提供dbnull.value用来表示数据库中的null。以为dbnull.value是object类型。所以需要这样用:

object objname;
string name=tbname.text;
if(name.length<0)
{
  objname=dbnull.value;
}else
{
  objname=name;
}

接着sqlparameter参数改为objname。

同时读取数据库时,存在null,返回给.net的值也是dbnull.value。所以读取后还要判断后赋值,用法如下:

if(row[“name”]==dbnull.value)
{
 name=null;
}
else
{
 name=(string)row[“name”];
}

但是也有个问题,如果是int类型,则不能为null,就该定义的时候用int? age。

必须严格区分0,null和“”,否则出现问题很难查到。

附带上次讲的sqlhelper里的两个函数,就是对上面两个用法的封装,可以直接用在sqlparameter参数中。

可空数据输入数据库时用

public static object todbvalue(this object value)

    {
      return value == null ? dbnull.value : value;
    }

输出时用

    public static object fromdbvalue(this object dbvalue)
    {
      return dbvalue == dbnull.value ? null : dbvalue;
    }

这个主要是用在sqlparameter中,实现可空数据的输入输出。

以上内容是关于本文给大家介绍的c#连接数据库的方法,希望大家喜欢。

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网