您的位置:首页 > 数据库

C#操作数据库经典

2014-11-11 16:30 302 查看
转自:http://blog.csdn.net/Pet8766/article/details/7575637

ADO.NET中对数据库的操作是:断开式连接,只需要写一次连接服务器,数据库名,用户名,密码的字符串,以后只对con 进行close()和con.Open() 操作即可连接数据库。

先从数据库中取出结果集后进行处理数据后再UpData更新到数据库(共三步)

如果只想读取和显示数据,则只需使用数据读取器SqlDataReader即可,但要处理数据然后更新数据库(增加,更改),就需要用数据集DataSet和数据适配器SqlDataAdaper。

SqlDataAdapter在下面有用法:

其中:读取数据时用SqlDataReader是固定的 但是处理数据更新时(增加,更改)为两种情况,
(一)直接拼SQL语句 适用于简单的表,

(二)用参数的——用到SqlDataAdaper 适用于复杂的表 

建议:简单的表可以用(一),但是在实际项目中复杂的表最好用(二),因为带参数的,要插入或更改的数据结构已被参数欲留位置了,不用对其进行类型转换,当在后面定义了参数后会自动转换,比较简单。其中删除一条记录不用带参数的 直接用(一)拼SQL语句 cmd.ExecuteNonQuery()即可;只有insert 和 update 增加和更改用带参数的 如果全部删除也的用带参数的

 补充(必看):定义个全局变量 Private SqlConnection m_con =null;然后在方法内部 m_con =new 出来 

断开式连接体现在:写一个连接数据库的方法,返回bool值。以后再就不用写连服务器,数据库名,用户名,密码的字符串了,以后再连接数据库就直接用m_con.Open();即可打开

  public  bool db_check()//当然复杂时就用传参数形式

  {

   bool flag=false;

   string ConnectionString ="data source =" + dbServerName.Text +";initial catalog=" + dbName.Text + ";

   user id=" +dbUsername.Text + ";password=" +this.dbPassword.Text + ";";

   try

   {

    m_con = new SqlConnection(ConnectionString);

    m_con.Open();

    MessageBox.Show("数据库连接成功!");

    flag=true;

   }

   catch

   {

    MessageBox.Show("数据库连接不成功!");

    flag=false;

   } 

   return flag;

  }

(一)、c#连接SQL数据库代码:==只是一个简单的例子

 public DataTable Read()

 {

 DataTable dt =new DataTable();//新建表

 dt.Columns.Add("col_1");//新建表中的列

 dt.Columns.Add("col_2");

 string ConnectionString ="data source=localhost;initial catalog=pubs;user id=sa;password=sa";

 SqlConnection Conn= new SqlConnection(ConnectionString);

 if (Conn.State==ConnectionState.Open)

 {

 Conn.Close();

 }

 Conn.ConnectionString=ConnectionString;

 Conn.Open();

 try

 {

 SqlCommand cmd=new SqlCommand("Select * from tab_name",Conn);

 SqlDataReader myReader =cmd.ExecuteReader();//执行SQL语句的真正查询了

 int a=0;

 int b=0;//用来接收已经查询出来的字段

 while (myReader.Read()) 每次循环查到的一行 如果有N行就循环N次而已

  {

 DataRow dr =dt.NewRow();//每循环一次新建一行

 dr[0] =myReader.GetInt32(0).ToString(); 表示接收第一个字段(string型)

        dr[1] =myReader.GetInt32(1).ToString();  

 dt.Rows.Add(dr);//每次循环把dr加进去

   }

 myReader.Close();

 Conn.Close();

 }

 catch(Exception ex)

 {

  MessageBox.Show(ex.Message.ToString());

 }

 return dt;

 }

 (二)、 关于Command对象 (SqlCommand有两种方法各有优点)

   //只用于查询 其实可以用于多记录查询 两个SQL语句连起来 用 myReader.NextResult() 即可

 (A)SqlCommand cmd =new SqlCommand(SqlText,con);//这是读数据 此要和 SqlDataReader连用 再和ExecuteReader或ExecuteScalar连用.

       new 这个是用来读数据的 就用DataReader 来接

 这句等同于下面的三句

 (B)

   //这个不用于查询 用于执行T_SQL增删改等等 

 SqlCommand cmd =con.CreateCommand();

 cmd.CommandTest="Create table tab_name (name varchar(20),password varchar(20))";

 cmd.ExecuteNonQuery();

 ***说明 :关于SqlCommand用法有ExecuteNonQuery、ExecuteReader,ExecuteScalar三种其中ExecuteReader(所有查询),ExecuteScalar(首行首列查询)

          ExecuteNonQuery为执行T-SQL语句但是不建议查询

          如果一个类有多个SQL语句要执行用(B)ExecuteNonQuery三句 但是ExecuteNonQuery自动执行最靠近它的那句CommandTest(每次只执行一句)

          如果一个类中只有一个SQL语句要执行用(A)即可

 ***说明: (A)A与ExecuteReader,ExecuteScalar相匹配

          (B)B三句的与ExecuteNonQuery相匹配

 

 (三)、关于数据读取器 SqlDataReader 对象 (其中SqlDataReader是和SqlCommand cmd =new SqlCommand(SqlText,con)它连用的)

  如果只想读取和显示数据 则只需使用数据读取器 SqlDataReader即可 但要处理数据然后更新数据库,就需要用数据集DataSet和适配器 SqlDataAdaper

         SqlDataReader reader =new SqlDataReader();

         (A)实例:

 SqlCommand cmd=new SqlCommand("Select * from tab_name",Conn);

 SqlDataReader myReader =cmd.ExecuteReader();//执行SQL语句的真正查询了

 while (myReader.Read()) 每次循环查到的一行 如果有N行就循环N次而已

  {

 DataRow dr =dt.NewRow();//每循环一次新建一行

 dr[0] =myReader.GetInt32(0).ToString(); 表示接收第一个字段(string型)

        dr[1] =myReader.GetInt32(1).ToString();  

 dt.Rows.Add(dr);//每次循环把dr加进去

 (B):GetSchemaTable方法 返回一个已填充的DataTable实例 (可以一次读出完整表的内容)

  DataTable schema =reader.GetSchemaTable();

  用它可以把数据库中查询出的结果集以表的形式得到完整的传给schema表 

                就可以通过DataTable的Rows属性检索行集,通过DataTable 的Columns属性检索列集(Rows属性可用于给表添加新行或者从表中删除行,

                Columns属性可用于添加列或者删除现有的列)

         实例:

  DataTable schema =reader.GetSchemaTable();//查询出的结果集以表的形式得到完整的传给schema表

       foreach(DataRow row in schema.Rows) //这时相当于对schema表进行操作了

                {

    foreach(DataColumn col in schema.Columns)

    { 

   Console.WriteLine(col.ColumnName + "=" + row[col]);

   Console.WriteLine("==========");

     }

  }

 (C): reader.NextResult()  使用数据读取器处理多个结果集

            string sql_1=@"select * from tab_1";

     string sql_2=@" select * from tab_2";//这里一定要有个空格才可以 因为当两个SQL语句连接时要用空格分开

            string sql =sql_1 + sql_2;

     SqlCommand cmd =new SqlCommand(sql,con);//执行两个或多个SQL语句的联合查询

     SqlDataReader reader =cmd.ExecuteReader();//这时有多个结果集

            do

  {

   while(reader.Read())//读取一个结果集的所有内容

   {

   Console.WriteLine("{0}:{1}",reader[0],reader[1]);

   }

   Console.WriteLine("".PadLeft(60,'='));

  }

        while(reader.NextResult());//循环读下个结果集

 ***补充:如果想判断当SqlDataReader没有读出结果时要做的处理方法:

          首先要走

   while(reader.Read())//读取一个结果集的所有内容

    {

    Console.WriteLine("{0}:{1}",reader[0],reader[1]);

    }

      中的reader.Read();//必须要走这一步

                         如果想判断当没有读出结果时 就必须在While(reader.Read())之后

   if(reader.HasRows==false)//判断如果没有读出结果

    {

     MessageBox.Show("要查询的结果不存在!");

    }

   这是没有读出结果时 如果读出结果了 那就直接走while(reader.Read()){}里面了就不走if(){}里面了

   其实如果用到了DataTable 也可以用if(dt.Rows.count<0){}也可以的

[SqlDataAdapter]

   (四)、SqlDataAdapter

  数据集和数据适配器  DataSet 和 SqlDataAdapter

           知识点:

            SqlDataAdapter da =new  SqlDataAdapter();

      (1)da.Fill();

  (2)da.SelectComand=new SqlCommand(sqlText,con);

  (3)DataTable dt=new DataTable();

       dt.Select(where条件,升降序);

  (4)

  填充数据集有两种方法:

               :使用数据适配器

                  :从XML文档中读取数据 

   4.1)

          SqlDataAdapter da =new  SqlDataAdapter();

    da.SelectCommand =new SqlCommand(sqlText,con);

          DataSet ds =new DataSet();

          da.Fill(ds,"tab_name");//Fill方法内部使用数据读取器访问表模式和数据,然后使用他们填充数据集

                                 //相当于执行SQL语句后把结果集取出后赋给DataSet中的tab_name表。

   4.2)

          数据集的筛选和排序:例子

  static void Main(string [] args)

  {

   string ConnectionString =@"data source=localhost;initial catalog=northwind;user
id =sa;password=sa;";

   string sql_1=@"select * from customers";

   string sql_2=@" select * from products where unitprice <10";//注意当第二句连接时要有个空格

   string sql = sql_1+sql_2;//两条SQL语句拼接

   SqlConnection con =new SqlConnection(ConnectionString);

   if (con.State==ConnectionState.Open)

   {

    con.Close();

   }

   try

   {

    con.Open();

    SqlDataAdapter da=new SqlDataAdapter();//A

    da.SelectCommand=new SqlCommand(sql,con);//B

    //其中A和B两句合并相当于:SqlDataAdapter da=new SqlDataAdapter(sql,con);这一句

    

    DataSet ds=new DataSet();

    da.Fill(ds,"customers");

    DataTableCollection dtc =ds.Tables;//通过这句把DataSet中的所有表都给了Table表集合

    Console.WriteLine("Results frm Customers table:");

    Console.WriteLine("CompanyName".PadRight(20) + "ContactName".PadLeft(23) + "\n");

    //以下两句是筛选条件

    string fl ="country='Germany'";//where 条件

    string srt ="companyname asc"; //降序

    //下面是知识点 数据集的筛选条件

    foreach(DataRow row in dtc["customers"].Select(fl,srt))//这是用法 

     //dtc["customers"]说明:dtc表集合中的customers表 .Select() 就是筛选条件

    {

     Console.WriteLine("{0}\t{1}",row["CompanyName"].ToString().PadRight(25),row["ContactName"]);

    }

    Console.WriteLine("\n----------------------------");

    Console.WriteLine("Results form Products table:");

    Console.WriteLine("ProductName".PadRight(20) + "UnitPrice".PadLeft(21) + "\n");

    foreach(DataRow row in dtc[1].Rows)

      {

     Console.WriteLine("{0}\t{1}",row["productname"].ToString().PadRight(25),row["unitprice"]);

    }

    Console.ReadLine();

   }

   catch(Exception ex)

   {

    Console.WriteLine("Error:"+ ex);

    Console.ReadLine();

   }

   finally

   {

    con.Close();

   }

  }

    4.3)

    使用DataView  其实DataView 的功能4.2)数据集都可以实现 所以一般不常用

  DatView 是DataTable内容的动态表示,与SQL视图一样,他不保存数据

  下面一句就是把dt表中的记录有赋给了DataView dv 然后对dv进行操作 DataView有自己的动态方法

  DataView dv =new DataView(dt,"country='Germany'","country", DataViewRowState.CurrentRows);

   

    例子:

  static void Main(string []args)

  {

   string ConnectionString =@"data source =localhost;initial catalog =northwind;user
id =sa;password=sa;";

   string sqlText=@"select contactname,country from customers";

   SqlConnection con =new SqlConnection(ConnectionString);

   if (con.State==ConnectionState.Open)

   {

    con.Close();

   }

   try

   {

    SqlDataAdapter da =new SqlDataAdapter(sqlText,con);

    //da.SelectCommand =new SqlCommand(sqlText,con);

    DataSet ds=new DataSet();

    da.Fill(ds,"customers");//填充给DataSet中的Customeres表

    DataTable dt=ds.Tables["customers"];

    //下面一句就是把dt表中的记录有赋给了DataView dv 然后对dv进行操作 DataView有自己的动态方法

    DataView dv =new DataView(dt,"country='Germany'","country", DataViewRowState.CurrentRows);

    //其中第一个参数是DataTale,第二个是对DataTable内容进行筛选的筛选器,第三个是排序,最后一个参数指定要在视图中包含的行的类型

    foreach(DataRowView drv in dv)

    {

     for(int i=0;i<dv.Table.Columns.Count;i++)

     {

      Console.Write(drv[i] + "\t");

     }

     Console.WriteLine();

     

    }

      Console.ReadLine();

   }

   catch (Exception ex)

   {

    Console.WriteLine("Error:" + ex);

   }

   finally

   {

    con.Close();

   }

  }

 4.4)修改数据集中的记录   其实这个4.4)单独是没有意义的 应该是4.5以后将更新保存到数据库源

            说明:对数据集所做的变化不会自动保存到数据库中,为了把这些变化保存到数据库中,需要再次连接数据库,显示完成更新

     例子:

  static void Main()

  {

   string ConnetionString=@"data source=localhost;initial
catalog=northwind;user id =sa;password=sa;";

   string qry=@"select * from employees where country='UK'";

   string udp=@"update employees set city=@city where employeeid=@employeeid";

   SqlConnection con =new SqlConnection(ConnetionString);

   try

   {

    SqlDataAdapter da= new SqlDataAdapter();

           da.SelectCommand =new SqlCommand(qry,con);

    DataSet ds=new DataSet();                                                                                                            

    da.Fill(ds,"employees");

    DataTable dt=ds.Tables["employees"];

    //以下更改了表的信息

    dt.Columns["FirstName"].AllowDBNull=true;

    dt.Rows[0]["city"]="Wilmington";

    //以下为表添加了新行

    DataRow newRow =dt.NewRow();

    newRow["firstname"]="li";

    newRow["lastname"]="yong";

    newRow["titleofcourtesy"]="haha";

    newRow["city"]="dalian";

    newRow["country"]="UK";

    dt.Rows.Add(newRow);

    //可以显示更新后的信息 这时只更新了数据集 但是没有更新数据库

    foreach(DataRow row in  dt.Rows)

    {

     Console.WriteLine("{0}{1}{2}",row["firstname"].ToString().PadRight(15),row["lastname"].ToString().PadLeft(25),row["city"]);

    }

    

    Console.ReadLine();

   }

   catch(Exception ex)

   {

    Console.WriteLine("Error:" + ex);

   }

   finally

   {

    con.Close();

   }、

  4.5)将变化保存到数据源

   以下3个属性可用于把数据集中的数据更新和同步到数据源(类似于支持查询的SelectCommand属性)

   *UpdateCommand

   *InsertCommand

   *DeleteCommand

        ***A)UpdateCommand属性

   SqlDataAdapter da =new SqlDataAdapter();

   要想对数据库进行修改要是动态的必须有参数

   //以下这是第二次操作数据库(用SqlCommand)进行更改 

   SqlCommand cmd=new SqlCommand(upd,conn);//udp为SQL语句 它是有参数的

   cmd.Parameters.Add("@city",SqlDbType.NVarChar,15,"city");//为upd语句设定两个参数

   cmd.Parameters.Add("@employeeid",SqlDbType.Int,4,"employeeid");

   da.UpdateCommand=cmd;

   da.Update(ds,"表名");

    

  

  static void Main()

  {

   string ConnectionString =@"data source =localhost;initial catalog=northwind;user
id =sa;password=sa;";

   string qry=@"select * from employees where country='UK'";//用于从库中取出数据进行更改用的SQL

   string upd=@"update employees set city=@city where
employeeid =@employeeid";//更改的SQL

   SqlConnection conn =new SqlConnection(ConnectionString);

   try

   {

    SqlDataAdapter da =new SqlDataAdapter();

    da.SelectCommand=new SqlCommand(qry,conn);

    DataSet ds=new DataSet();

    da.Fill(ds,"employees");

    DataTable dt=ds.Tables["employees"];

    (a)dt.Rows[0]["city"]="Wilmington11";//改后的信息 其实是SQL update语句的参数

    //以下只是数据集做了更改后显示出来

    foreach(DataRow row in dt.Rows)

    {

     Console.WriteLine("{0}{1}{2}",row["firstname"].ToString().PadRight(15),row["lastname"].ToString().PadLeft(25),row["city"]);

    }

    //这以下才是对数据库进行的真正更改

    SqlCommand cmd=new SqlCommand(upd,conn);//udp为SQL语句 它的参数是(a)

    //设定两个参数

     cmd.Parameters.Add("@city",SqlDbType.NVarChar,15,"city");

     cmd.Parameters.Add("@employeeid",SqlDbType.Int,4,"employeeid");

        da.UpdateCommand=cmd;//修改赋值

    da.Update(ds,"employees");//修改

   }

   catch(Exception ex)

   {

    Console.WriteLine("Error:"+ ex);

   }

  ***B)InsertCommand属性

   数据适配器使用InsertCommand属性在表中插入行,调用Update方法时,将搜索以前添加到表中的说有新行,并保存到数据库中。

   static void Main()

   {

   string ConnectionString =@"data source=localhost;initial catalog=northwind;user
id =sa;password=sa";

   string qry=@"select * from employees where country='UK'"; //第一步
从库中取数据SQL语句

   string ins=@"

   insert into employees(firstname,lastname,titleofcourtesy,city,country)   //第二步SQL更改语句

              values

   (

    @firstname,

    @lastname,

    @titleofcourtesy,

    @city,

    @country

   )

   ";

   SqlConnection conn =new SqlConnection(ConnectionString);

   try

   {

    SqlDataAdapter da=new SqlDataAdapter();

    da.SelectCommand=new SqlCommand(qry,conn);

    DataSet ds =new DataSet();

    da.Fill(ds,"employees");

    DataTable dt=ds.Tables["employees"];//已把原库中的数据赋值给了dt

    DataRow newRow =dt.NewRow();

    //以下添加的每列新行就是 下面参数的要赋的新值

    newRow["firstname"]="li";

    newRow["lastname"]="yong";

    newRow["titleofcourtesy"]="Sir";

    newRow["city"]="Birmingham";

    newRow["country"]="UK";

    dt.Rows.Add(newRow);//然后为dt添加一个新行

    foreach(DataRow row in dt.Rows)//把现在的结果遍例出来

    {

     Console.WriteLine("{0}{1}{2}",

      row["firstname"].ToString().PadRight(15),

      row["lastname"].ToString().PadLeft(25),

      row["city"].ToString().PadLeft(35)

      );

    }

    

    SqlCommand cmd =new SqlCommand(ins,conn);//传递InsertCommand SQL更改命令

       //以下是设定InsertCommand参数

     cmd.Parameters.Add("@firstname",SqlDbType.NVarChar,10,"firstname");

     cmd.Parameters.Add("@lastname",SqlDbType.NVarChar,20,"lastname");

     cmd.Parameters.Add("@titleofcourtesy",SqlDbType.NVarChar,25,"titleofcourtesy");

     cmd.Parameters.Add("@city",SqlDbType.NVarChar,15,"city");

     cmd.Parameters.Add("@country",SqlDbType.NVarChar,15,"country");

    以下两句是真正的更改数据库

    da.InsertCommand=cmd;

    da.Update(ds,"employees");

    Console.ReadLine();

   }

   catch(Exception ex)

   {

    Console.WriteLine("Error:"+ex);

    Console.ReadLine();

    

   }

   finally

   {

    conn.Close();

   }

        }

  ***C)DeleteCommand 属性

  DeleteCommand 属性可用于执行SQL DELETE语句。

  

  static void Main()

  {

   string ConnectionString =@"data source =localhost;initial catalog=northwind;user
id =sa;password=sa;";

   string qry=@"select * from employees where country='UK'";//第一步 从库中取数据SQL语句

   string del=@"delete from employees where employeeid =@employeeid";
//第二步SQL更改语句

   SqlConnection con=new SqlConnection(ConnectionString);

   try

   {

    //注释: 虽然这段代码用的delete语句用到了参数where employeeid =@employeeid
         //但是在下面又用到了filt 筛选条件 所以明确了用名字来判断 那么where employeeid=@employeeid就没有意义了 

    SqlDataAdapter da=new SqlDataAdapter();

    da.SelectCommand =new SqlCommand(qry,con);

    DataSet ds=new DataSet();

    da.Fill(ds,"employees");

    DataTable dt =ds.Tables["employees"];  //把原来的数据库中数据提取出来赋给dt

    SqlCommand cmd=new SqlCommand(del,con);  //传递DeleteCommand SQL更改命令

    cmd.Parameters.Add("@employeeid",SqlDbType.Int,4,"employeeid");  //为DeleteCommand添加参数

    string filt=@"firstname='li' and lastname='yong'";//筛选条件

    foreach(DataRow row in dt.Select(filt))

    {

     row.Delete();

    }

    //以下两句真正删除数据

    da.DeleteCommand=cmd;

    da.Update(ds,"employees");

      //把现在的结果集遍例出来

    foreach(DataRow row in dt.Rows)

    {

     Console.WriteLine("{0}{1}{2}",row["firstname"].ToString().PadRight(15),row["lastname"].ToString().PadLeft(25),row["city"]);

    }

    Console.ReadLine();

   }

   catch(Exception ex)

   {

    Console.WriteLine("Error:" + ex);

   }

   finally

   {

    con.Close();

   }

  }

 五) 关于DataRowView 的用法(此时要想得到listBox选中的数据(前提是把数据库中的数据赋给listBox))

   DataRowView rowView=(DataRowView)this.listBox1.Items[this.listBox1.SelectedIndex];

   string str=rowView.Row.ItemArray[0].ToString();

   MessageBox.Show("您选择的是:"+str,"***这种方法只能这样写代码,请看看");

  ***详见级联菜单的例子

  

 用以下的cmd命令可以创建一个新的iis站点:

C:\Inetpub\AdminScripts> adsutil.vbs create_vserv W3SVC/2 

C:\Inetpub\AdminScripts> adsutil.vbs copy W3SVC/1 W3SVC/2

[到9了]

删除:

C:\Inetpub\AdminScripts> adsutil.vbs delete W3SVC/2

List:

C:\Inetpub\AdminScripts> adsutil.vbs enum w3svc /p

当然,创建了以后也只能同时运行一个。     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C#数据库