C#连接数据库的方法

以下内容给大家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#连接数据库的方法,希望大家喜欢。

(0)

相关推荐

  • C#访问SQL Server数据库的实现方法

    本文实例讲述了C#访问SQL Server数据库的实现方法.分享给大家供大家参考.具体如下: 这里介绍一下用C#访问SQL Server数据库.这里要涉及到几个类:SqlConnection类.SqlCommand类.SqlDataReader类. SqlConnection类用于建立与数据库的连接,SqlCommand类用于创建SQL命令,SqlDataReader对象是执行SqlCommand对象返回结果集的查询语句后的结果. 下面是部分代码: /*其中server表示服务器,"."

  • C#.NET中如何批量插入大量数据到数据库中

    在WEB项目开发过程中有时会碰到批量插入数据到数或者是将EXCEL文件据入到数据库中.为了方便实现可以先将EXCEL导入到GRIDVIEW中然后一次批量插入.实现代码如下: 前台代码 <asp:GridView ID="dgBom" runat="server" AutoGenerateColumns="false" CellPadding="1" CellSpacing="2"> <He

  • C#实现Excel导入sqlite的方法

    本文实例讲述了C#实现Excel导入sqlite的方法,是非常实用的技巧.分享给大家供大家参考.具体方法如下: 首先需要引用system.date.sqlite 具体实现代码如下: system.date.sqlite system.date.sqlite.linq //导入--Excel导入sqlite private void button2_Click(object sender, EventArgs e) { DAL.Sqlite da = new DAL.Sqlite("DataByE

  • C#动态创建Access数据库及密码的方法

    以前工作中需要全新的Access数据库,可以复制数据库,也可以把新的数据库放到资源里面,用新数据库的时候释放出来,都感觉不爽,还是动态生成心理舒服. 生成数据库要使用ADO,首先添加引用. using System.IO; using System.Data.OleDb; //连接Access数据库 using ADOX; //引用COM:Microsoft ADO Ext. 2.8 for DDL and Security //添加引用:Microsoft ActioveX Data Obje

  • C#操作数据库中存取图片文件的方法

    本文实例讲述了C#操作数据库中存取图片文件的方法.分享给大家供大家参考.具体如下: private string sqlconnstr = "Data Source=.;Database=db_test;User id=sa;PWD=123456"; /*功能:把一种图片插入到数据库中 *返回值:无 */ void InsertImageToDB() { //将需要存储的图片读取为数据流 FileStream fs = new FileStream(@"D:/Bear.jpg

  • C#编程实现连接SQL SERVER数据库实例详解

    本文实例讲述了C#编程实现连接SQL SERVER数据库.分享给大家供大家参考,具体如下: 首先,在SQL SEVER里建立一个名为"Exercise"的数据库名,在该数据库下建立一张名为"lianxi"的表.好,现在开始写代码. 在FORM1里拖一个DATAGIRDVIEW用于显示表,在放一个BUTTON用于执行操作.加入命名空间 复制代码 代码如下: using system.data.sqlclient; private void button1_Click(

  • C#使用ADO.Net部件来访问Access数据库的方法

    数据库的访问是所有编程语言中最重要的部分,C#提供了ADO.Net部件用于对数据库进行访问.我们将从最简单易用的微软Access数据库入手讨论在C#中对数据库的访问. C#中的Connection对象和Command对象与Access类似,但在这里我们还将使用其另一个与RecordSet类似的被称作ADODataReader的对象,它负责处理与查询有关的RecordSet对象. 首先,必须使用微软的Access创建一个数据库.运行Access,创建一个数据库,但不要创建任何表(我们将在下面的程序

  • C#数据库操作的用法

    由于最近和数据库打交道,需要用C#和SQL Server 2005进行操作,就把近段时间内的最常用的操作做个总结.本人也是第一次用C#操作数据库,所以这三种典型用法对初学者还是挺有帮助的. 以下是我在visual studio 2005上写的一个类(连的是SQL Server 2005),已经过测试通过.里面有3个方法比较典型,源码如下: using System; using System.Collections.Generic; using System.Text; using System

  • C#编程实现连接ACCESS数据库实例详解

    本文实例讲述了C#编程实现连接ACCESS数据库的方法.分享给大家供大家参考,具体如下: 一.建立FORM窗体,加一个按钮控件,加一个DATAGRIDVIEW控件. 二.双击FORM,加入命名空间 复制代码 代码如下: using System.Data.OleDb; 双击按钮,进入按钮代码,写如下代码 OleDbConnection strConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source

  • C#怎样才能将XML文件导入SQL Server

    问:怎样才能将XML文件导入SQL Server 2000? 答:将XML文件导入SQL Server有若干种方法,这里提供其中的3种: 大容量装载COM接口.如果需要将文档的实体和属性析取到关系表中,最快的方法就是使用SQL Server 2000 Extensible Markup Language 3.0 Service Pack 1(SQLXML 3.0 SP1)提供的大容量装载COM接口.大容量状态COM接口包含在SQLXML 3.0 SP1的免费下载中. textcopy.exe命令

  • C#创建数据库及导入sql脚本的方法

    本文实例讲述了C#创建数据库及导入sql脚本的方法.分享给大家供大家参考,具体如下: C#创建数据库: /// <summary> /// 创建数据库 /// </summary> /// <param name="connStr">连接字符串</param> /// <param name="_strDBName">数据库名称</param> /// <returns></r

随机推荐