zoukankan      html  css  js  c++  java
  • c# 数据库操作,多数据库操作、数据库操作异常报错等问题

    1、引入相关的命名空间

    在C#中要操作数据库,一般情况需要引入两个命名空间,在三种连接模式中都要引入下面的命名空间:

         System.Data;描述与数据源连接的当前状态。

     //
            // 摘要:
            //     连接已关闭。
            Closed = 0,
            //
            // 摘要:
            //     连接处于打开状态。
            Open = 1,
            //
            // 摘要:
            //     连接对象连接到数据源。
            Connecting = 2,
            //
            // 摘要:
            //     连接对象执行命令。 (此值保留供该产品的未来版本中)。
            Executing = 4,
            //
            // 摘要:
            //     连接对象正在检索数据。 (此值保留供该产品的未来版本中)。
            Fetching = 8,
            //
            // 摘要:
            //     与数据源的连接已断开。 只有在打开连接后,才发生这种。 处于此状态的连接可能关闭并重新打开。 (此值保留供该产品的未来版本中)。
            Broken = 16

    而另外一个命名空间,使用不同的连接模式而不同,如果使用SqlClient模式的话,则需要引入如下命名空间:

         System.Data.SqlClient;

      方法

      

    //
    // 摘要:
    // 如果给定包含连接字符串的字符串,则初始化 System.Data.SqlClient.SqlConnection 类的新实例。
    //
    // 参数:
    // connectionString:
    // 用于打开 SQL Server 数据库的连接。
    1public SqlConnection(string connectionString); 
     //
     // 摘要:
     //     最近在连接上执行网络操作时表示 System.Data.SqlClient.SqlConnection 的状态。
    //
     // 返回结果:
     //     一个 System.Data.ConnectionState 枚举。
    2public override ConnectionState State { get; }
    //
    // 摘要:
    // 关闭与数据库之间的连接。 此方法是关闭任何打开连接的首选方法。
    //
    // 异常:
    // T:System.Data.SqlClient.SqlException:
    // 打开连接时出现的连接级别的错误。
    public override void Close();
    3、//
            // 摘要:
            //     关闭与数据库之间的连接。 此方法是关闭任何打开连接的首选方法。
            //
            // 异常:
            //   T:System.Data.SqlClient.SqlException:
            //     打开连接时出现的连接级别的错误。
            public override void Close();
       4、  //
            // 摘要:
            //     释放由 System.ComponentModel.Component 使用的所有资源。
            public void Dispose();
      //
            // 摘要:
            //     创建并返回与 System.Data.SqlClient.SqlConnection 关联的 System.Data.SqlClient.SqlCommand
            //     对象。
            //
            // 返回结果:
            //     一个 System.Data.SqlClient.SqlCommand 对象。
        5    public SqlCommand CreateCommand();
      //
            // 摘要:
            //     获取或设置要在数据源中执行的 Transact-SQL 语句、表名或存储过程。
            //
            // 返回结果:
            //     要执行的 Transact-SQL 语句或存储过程。 默认值为一个空字符串。
    6public override string CommandText { get; set; }

    C#中Dispose、析构函数、close的区别

    如果使用OleDb模式的话,需要使用下面的命名空间:

         System.Data.OleDb;

    如果使用Odbc模式的话,需要使用下面的命名空间:

        System.Data.Odbc;

    2、定义连接字符串,并建立连接对象

    在C#中,如果想连接数据库的话,需要使用Connection连接对象。同样,不同的连接模式下,所使用的连接对象也不同:

    (1)如果使用SqlClient模式的话,其基本连接字符串和连接对象如下:

    连接字符串:string connString = "server=.;database=testDB;uid=sa;pwd=;";

    其中,server是指数据库所在的机器(服务器),如果使用当前机器(本地机器)的话,可 以使用“.”、“(local)”、“127.0.0.1”或本地机器的名字。如果使用其它机器上的数据库的话,可以使用那台机器的机器名字(确保域和工 作组的正确)或IP地址。database指的数据库的名字。uid和pwd分别代表连接数据库的用户名和密码。

    定义连接字符串后,就可以建立SqlClient模式下的连接对象了,在SqlClient模式下,应使用SqlConnection。

    SqlConnection sConn = new SqlConnection(connString);

    例子,建立一个公共类DBConn.cs

    若想调用:

     SqlConnection conn = BaseClass.DBConn.CyCon();

    conn.Open();

    (2)如果使用OleDb模式的话,其基本连接字符串和连接对象如下:

    连接字符串:string connString = "Provider=SQLOLEDB.1;DataSource=(local);uid=sa;pwd=;Initial Catalog=testDB";

    其中,Provider给出数据提供程序;DataSource给出数据库所在的服务器名或 IP地址(具体同SqlClient模式下的server关键字);uid和pwd分别指用户名和密码;Initial Catalog给出的是所连接的数据库的名字。如果使用Access数据库的话,其连接字符串的形式应该如下:

    string connString = "provider=Microsoft.Jet.OLEDB.4.0;Data Source = F:\student.mdb";

    定义好连接字符串后,就可以定义连接对象了,在该模式下,应使用OleDbConnection。

    OleDbConnection odConn = new OleDbConnection(connString);

    (3)如果使用Odbc模式的话,其基本连接字符串和连接对象如下:

    连接字符串:string connString = "Driver={Sql Server};Server=.;Database = testDB;uid=sa;pwd=;";

    如果使用Access数据库,其连接字符串如下:

    string connString = "{Microsoft Access Driver(*.mdb)};Dbq = "F:\student.mdb";";

    定义好连接字符串后,使用OdbcConnection建立连接对象:

    OdbcConnection oConn = new OdbcConnection(connString);

    3、打开数据库连接

    打开数据库使用Open方法,但在试图打开数据连接时会发生错误,因此常采用如下的异常控制方法(这里假设打开SqlClient模式下连接,实际上只不过连接对象的名字不同而已):

         try
                {
                         sConn.Open();
                }
                catch(Exception ex)
                {
                          MessageBox.Show("发生错误:"+ex.Message);
                         //Console.WriteLine("发生错误:"+ex.Message); //在控制台下使用这种方式
                }

    4、Command命令对象的应用

    Command用于向数据库传输的命令的对象,其构造函数常用两个参数,一个参数是所使用的 命令文本(CommandText),另一个为所使用的连接对象Connection。根据不同的数据库连接模式,其形式也不同,SqlCommand对 应着SqlClient模式;OleDbCommand对应着OleDb模式,OdbcCommand对应着Odbc模式。

    假设我们想使用SqlClient模式查询Sql Server中testDB数据库中student表中的xh(学号)、xm(姓名)和xb(性别)三列的值,则可以建立如下的命令对象(sConn参见建立的连接sConn:

    SqlCommand sCmd = new SqlCommand("SELECT xh,xm,xb FROM student",sConn);

    亦可使用如下的形式:

    SqlCommand sCmd = new SqlCommand();
            sCmd.CommandText = "SELECT xh,xm,xb FROM student";
           sCmd.Connection = sConn; 

    命令对象常用的有三个方法:ExecuteReader(), ExecuteNonQuery()和ExecuteScalar()。ExecuteReader方法用于返回查询结果的全部数据。 ExecuteNonQuery方法用于返回所影响的行数,一般用于Insert、Update和Delete操作。ExecuteScalar方法返回 结果中的第一行第一列的值。

    //查询 
     string names = lvDesk.SelectedItems[0].SubItems[0].Text;
                SqlConnection conn = BaseClass.DBConn.CyCon();
                conn.Open();
                SqlCommand cmd = new SqlCommand("select * from tb_Room where RoomName='" + names + "'", conn);
                SqlDataReader sdr = cmd.ExecuteReader();
                sdr.Read();
                string zt = sdr["RoomZT"].ToString().Trim();
                sdr.Close();
    
    //删除、修改
    string names = lvDesk.SelectedItems[0].SubItems[0].Text;
                    SqlConnection conn = BaseClass.DBConn.CyCon();
                    conn.Open();
                    SqlCommand cmd = new SqlCommand("update tb_Room set RoomZT='待用',Num=0 where RoomName='" + names + "'", conn);
                    cmd.ExecuteNonQuery();
                    cmd = new SqlCommand("delete from tb_GuestFood where zhuotai='" + names + "'", conn);
                    cmd.ExecuteNonQuery();
                    conn.Close();
                    frmMain_Activated(sender, e);

    5、数据读取器DataReader

     内置方法
     1//
            // 摘要:
            //     让 System.Data.SqlClient.SqlDataReader 前进到下一条记录。
            //
            // 返回结果:
            //     如果存在更多行,则为 true;否则为 false。
            //
            // 异常:
            //   T:System.Data.SqlClient.SqlException:
            //     执行命令文本时,SQL Server 返回了一个错误。
            public override bool Read();
    
    
    
          2  // 摘要:
            //     获取指定列的值作为字符串。
            //
            // 参数:
            //   i:
            //     从零开始的列序号。
            //
            // 返回结果:
            //     指定列的值。
            //
            // 异常:
            //   T:System.InvalidCastException:
            //     指定的强制转换无效。
            public override string GetString(int i);
     

    DataReader用于从返回来的数据区中读取数据。其根据使用的数据连接模式不同也有不同的形式:SqlDataReader对应着SqlClient模式,OleDbDataReader对应着OleDb模式,OdbcDataReader对应着Odbc模式。

    数据读取器应与命令对象配合使用,下面接着4中的例子来写:

    SqlDataReader sdr = null;
            sdr = sCmd.ExecuteReader();     //执行命令对象,并用sdr指向结果集的第一条记录。
            while(sdr.Read())   //每读取一条记录后,指向其下一条记录
           {
                 Console.WriteLine("学号:{0},姓名:{1},性别:{2}",sdr["xh"],sdr["xm"],sdr["xb"]);   //或使用下面的格式
               // Console.WriteLine("学号:{0},姓名:{1},性别:{2}",sdr[0],sdr[1],sdr[2]);  
           } 
           sdr.Close();      //关闭读取器 

    在类中可以定义一个全局的变量读取

    public SqlDataReader sdr;

    6、数据集DataSet和数据适配器DataAdapter

    一般数据集和数据适配器是密不可分的,下面先介绍数据适配器。

    数据适配器可以容纳一组数据命令和一个数据库连接对象,这与Command对象不同, Command只有一个数据命令和一个数据库连接。数据适配器根据不同的连接模式也有不同的形式:SqlDataAdapter、 OleDbDataAdapter和OdbcDataAdapter。下面给出SqlClient模式下数据适配器的定义方式:

    SqlDataAdapter sda = new SqlDataAdapter("SELECT xh,xm,xb FROM student",sConn);

    第一个参数是用到的SQL语句,第二个参数是数据连接。也可以使用一个命令对象传递上面的信息。即:

    SqlDataAdapter sda = new SqlDataAdapter(sCmd);

    下面再介绍一下DataSet,DataSet是在内存中缓存的数据集,包括数据本身,还包括定义在数据上的约束和关系等信息。数据集中可以包含0个这样的数据对象。不管使用什么样的数据库连接模式,其只有唯一的形式。其定义方法如下:

    DataSet ds = new DataSet();

    定义完数据集后,就可以调用数据适配器的Fill方法来填充数据集:

    sda.Fill(ds);

    也可以在填充的同时,指定表名:

    sda.Fill(ds,"Student");

    可以使用下面的方法读取数据集中的数据信息:

    int rowNum = ds.Tables["Student"].Rows.Count;     //获得数据集表student表中的行数

    int columnNum = ds.Tables["Student"].Columns.Count; //获得数据集表student中的列数

    for(int i = 0; i < rowNum; i ++)
            {
               for(int j = 0; j < columnNum; j ++)
                  {
                        Console.Write(ds.Tables["student"].Columns[j].ColumnName+":"+ds.Tables["student"].Rows[i][j].ToString();
                 }
                 Console.WriteLine();

    }

    using System;
    //引入命名空间
    using System.Data;
    using System.Data.SqlClient;
    class DbOper
    {
         static void Main()
         {
             //定义连接字符串
              string connString;
             connString="server=.;uid=sa;pwd=;database=test;";
             //定义连接对象sConn
             SqlConnection sConn = new SqlConnection(connString);
             try
             {
                  //打开连接
                  sConn.Open();
             }
             catch(Exception ex)
             {
                  //给出错误信息
                  Console.WriteLine("连接错误:"+ex.Message);
             }
             //定义SQL查询语句
             string sql;
             sql = "select * from student";
             //定义命令对象sCmd
             SqlCommand sCmd = new SqlCommand(sql,sConn);
             //定义数据读取器sdr
             SqlDataReader sdr=null;
             //执行命令对象sCmd并赋值给sdr
             sdr = sCmd.ExecuteReader();
             //循环输出sdr中的内容
             Console.WriteLine("   学 号   姓名     性别民族");
             while(sdr.Read())
             {
                  Console.WriteLine(sdr[0]+" "+sdr["xm"]+sdr["xb"]+" "+sdr["mz"]);//可以以字段第几个,字段名称来找取值
             }
             //关闭数据读取器
             sdr.Close();
             //关闭数据库连接
             sConn.Close();
         }
    <code class="language-csharp"><span style="font-family:'Times New Roman';">//********************使用SqlDataAdapter  
    //数据库连接字符串  
      
    string strConnection = "Data Source=DREAM-PC;database=StudentData;uid=**;pwd=**";  
    public DataTable GetStudent()  
    {  
        SqlConnection conn = new SqlConnection(strConnection);  
        SqlCommand comm;  
        DataSet dtSet=new DataSet();  
        try  
        {  
            conn.Open();  
            string sqlstr="select * from StudentInfo";  
            comm = new SqlCommand(sqlstr,conn);  
            SqlAtapter sqlAdapter = new SqlDataAdapter(comm);  
            sqlAdapter.Fill(dtSet);  
            return dtSet.Tables[0];  
        }  
        finally  
        {  
            if(conn.State == ConnectionState.Open)  
                conn.Close();  
        }  
    }</span></code>  

     

    DataSet.Tables[0].Rows[0][1]的含义

    DataSet.Tables[0].Rows[0][1]表示DataSet中第一张表(因为Tables[0]就是第一张表的意思)中第一行(Rows[0][])

    第二列(Rows[][1])的数据。

    DataSet.Tables["tableName"]是指定获取特定的表名。如果DataSet只有一张表,则为DataSet.Tables[0].

    定义一些公共方法

        #region  建立数据库连接
            /// <summary>
            /// 建立数据库连接.
            /// </summary>
            /// <returns>返回SqlConnection对象</returns>
            public static SqlConnection getcon()
            {
                My_con = new SqlConnection(M_str_sqlcon);   //用SqlConnection对象与指定的数据库相连接
                My_con.Open();  //打开数据库连接
                return My_con;  //返回SqlConnection对象的信息
            }
            #region  测试数据库是否赋加
            /// <summary>
            /// 测试数据库是否赋加
            /// </summary>
            public void con_open()
            {
                getcon();
                //con_close();
            }
            #endregion
       #region  创建DataSet对象
            /// <summary>
            /// 创建一个DataSet对象
            /// </summary>
            /// <param name="M_str_sqlstr">SQL语句</param>
            /// <param name="M_str_table">表名</param>
            /// <returns>返回DataSet对象</returns>
            public DataSet getDataSet(string SQLstr, string tableName)
            {
                getcon();   //打开与数据库的连接
                SqlDataAdapter SQLda = new SqlDataAdapter(SQLstr, My_con);  //创建一个SqlDataAdapter对象,并获取指定数据表的信息
                DataSet My_DataSet = new DataSet(); //创建DataSet对象
                SQLda.Fill(My_DataSet, tableName);  //通过SqlDataAdapter对象的Fill()方法,将数据表信息添加到DataSet对象中
                con_close();    //关闭数据库的连接
                return My_DataSet;  //返回DataSet对象的信息
    
                //WritePrivateProfileString(string section, string key, string val, string filePath);
            }
            #endregion
         #region  读取指定表中的信息
            /// <summary>
            /// 读取指定表中的信息.
            /// </summary>
            /// <param name="SQLstr">SQL语句</param>
            /// <returns>返回bool型</returns>
            public SqlDataReader getcom(string SQLstr)
            {
                getcon();   //打开与数据库的连接
                SqlCommand My_com = My_con.CreateCommand(); //创建一个SqlCommand对象,用于执行SQL语句
                My_com.CommandText = SQLstr;    //获取指定的SQL语句
                SqlDataReader My_read = My_com.ExecuteReader(); //执行SQL语名句,生成一个SqlDataReader对象
                return My_read;
            }
            #endregion
     #region 创建DataSet对象
            ///<summary>
            ///创建一个DataSet对象
            ///</summary>
            ///<param name="M_str_sqlstr">SQL语句</param>
            ///<param name="M_str_table">表名</param>
            ///<returns>返回DataSet对象</returns>
            #endregion
            public DataSet getDataSet(string SQLstr, string tableName)
            {
                getcon();//打开与数据库的连接
                SqlDataAdapter SQLda = new SqlDataAdapter(SQLstr, My_con);//创建一个SqlDataAdapter对象,并获取指定数据表的信息
                DataSet My_DataSet = new DataSet();//创建DataSet对象
                SQLda.Fill(My_DataSet, tableName);//通过SqlDataAdapter对象的Fill()方法,将数据表信息添加到DataSet对象中
                con_close();    //关闭数据库的连接
                return My_DataSet;//返回DataSet对象的信息
            }

    二、异常

    1、CommandText 属性尚未初始化

  • 相关阅读:
    欧拉项目第十题;用筛法做,
    欧拉第十题 求2000000以内的素数之和
    求1000数字中13个相乘最大值
    筛法求10000以内的质数
    判断回文且寻找三位数乘三位数里最大的回文
    分解质因数
    输入一个正整数n,将其转换为二进制后输出。要求定义并调用函数dectobin(n),它的功能是输出
    hdu1863最小生成树krus模板&prim模板
    hdu 3870 最小割转化为最短路径2
    UVALive 3661 最小割转化为最短路径
  • 原文地址:https://www.cnblogs.com/michellexiaoqi/p/9889731.html
Copyright © 2011-2022 走看看