C#与SQL常用操作

C#与SQL常用操作

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

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

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

       数据适配器SqlDataAdaper

 

SqlDataAdapter在下面有用法:

 

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

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

      建议:简单的表可以用(一) 但是在实际项目中复杂的表最好用(二)

           因为带参数的 要插入或更改的数据结构已被参数欲留位置了,不用对其进行类型转换,当在后面定义了参数后会自动转换,比较简单

           其中删除一条记录不用带参数的直接用(一)拼SQL语句 cmd.ExecuteNonQuery()即可

           只有insert 和 update 增加和更改用带参数的 如果全部删除也的用带参数的

 

   补充(必看):定义个全局变量 Private SqlConnectionm_con =null;

        然后在方法内部 m_con=new 出来

        断开式连接体现在:写一个 连接数据库的方法 返回bool值 以后再就不用写连服务器,库名,用户名,密码的字符串了

        以后再连接数据库就直接用m_con.Open();即可打开

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

              {

                     boolflag=false;

                     stringConnectionString ="data source =" + dbServerName.Text +";initialcatalog=" + dbName.Text + ";

                     userid=" +dbUsername.Text + ";password=" +this.dbPassword.Text +";";

                     try

                     {

                            m_con= new SqlConnection(ConnectionString);

                            m_con.Open();

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

                            flag=true;

                     }

                     catch

                     {

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

                            flag=false;

                     }    

                     returnflag;

              }

 

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

       publicDataTable Read()

       {

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

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

       dt.Columns.Add("col_2");

       stringConnectionString ="data source=localhost;initial catalog=pubs;userid=sa;password=sa";

       SqlConnection Conn=new SqlConnection(ConnectionString);

       if(Conn.State==ConnectionState.Open)

       {

       Conn.Close();

       }

       Conn.ConnectionString=ConnectionString;

       Conn.Open();

       try

       {

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

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

       inta=0;

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

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

      {

       DataRowdr =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(Exceptionex)

       {

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

       }

       returndt;

       }

 

 

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

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

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

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

       这句等同于下面的三句

       (B)

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

       SqlCommandcmd =con.CreateCommand();

       cmd.CommandTest="Createtable 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)实例:

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

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

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

      {

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

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

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

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

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

              DataTableschema =reader.GetSchemaTable();

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

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

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

        实例:

              DataTableschema =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 * fromtab_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=newSqlCommand(sqlText,con);

              (3)DataTabledt=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)

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

              staticvoid Main(string [] args)

              {

                     stringConnectionString =@"data source=localhost;initial catalog=northwind;userid =sa;password=sa;";

                     stringsql_1=@"select * from customers";

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

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

                     SqlConnectioncon =new SqlConnection(ConnectionString);

                     if(con.State==ConnectionState.Open)

                     {

                            con.Close();

                     }

                     try

                     {

                            con.Open();

                            SqlDataAdapterda=new SqlDataAdapter();//A

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

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

                           

                            DataSetds=new DataSet();

                            da.Fill(ds,"customers");

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

                            Console.WriteLine("Resultsfrm Customers table:");

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

                            //以下两句是筛选条件

                            stringfl ="country='Germany'";//where 条件

                            stringsrt ="companyname asc"; //降序

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

                            foreach(DataRowrow 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("Resultsform Products table:");

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

 

                            foreach(DataRowrow in dtc[1].Rows)

                           {

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

                            }

                            Console.ReadLine();

                     }

                     catch(Exceptionex)

                     {

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

                            Console.ReadLine();

                     }

                     finally

                     {

                            con.Close();

                     }

              }

 

          4.3)

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

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

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

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

                    

          例子:

              static void Main(string[]args)

              {

                     stringConnectionString =@"data source =localhost;initial catalog =northwind;userid =sa;password=sa;";

                     stringsqlText=@"select contactname,country from customers";

                     SqlConnectioncon =new SqlConnection(ConnectionString);

                     if(con.State==ConnectionState.Open)

                     {

                            con.Close();

                     }

                     try

                     {

                            SqlDataAdapterda =new SqlDataAdapter(sqlText,con);

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

                            DataSetds=new DataSet();

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

 

                            DataTabledt=ds.Tables["customers"];

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

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

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

                            foreach(DataRowViewdrv in dv)

                            {

                                   for(inti=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以后将更新保存到数据库源

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

           例子:

              staticvoid Main()

              {

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

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

                     stringudp=@"update employees set city=@city where employeeid=@employeeid";

                     SqlConnection con =newSqlConnection(ConnetionString);

                     try

                     {

                            SqlDataAdapterda= new SqlDataAdapter();

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

                            DataSetds=new DataSet();                                                                                                           

                            da.Fill(ds,"employees");

                            DataTabledt=ds.Tables["employees"];

                            //以下更改了表的信息

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

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

                            //以下为表添加了新行

                            DataRownewRow =dt.NewRow();

                            newRow["firstname"]="li";

                            newRow["lastname"]="yong";

                            newRow["titleofcourtesy"]="haha";

                            newRow["city"]="dalian";

                            newRow["country"]="UK";

                            dt.Rows.Add(newRow);

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

                            foreach(DataRowrow in  dt.Rows)

                            {

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

                            }

                           

                            Console.ReadLine();

                     }

                     catch(Exceptionex)

                     {

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

                     }

                     finally

                     {

                            con.Close();

                     }、

 

              4.5)将变化保存到数据源

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

                     *UpdateCommand

                     *InsertCommand

                     *DeleteCommand

              ***A)UpdateCommand属性

                     SqlDataAdapterda =new SqlDataAdapter();

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

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

                     SqlCommandcmd=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,"表名");

                      

             

              staticvoid Main()

              {

                     stringConnectionString =@"data source =localhost;initial catalog=northwind;userid =sa;password=sa;";

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

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

                     SqlConnectionconn =new SqlConnection(ConnectionString);

                     try

                     {

                            SqlDataAdapterda =new SqlDataAdapter();

                            da.SelectCommand=newSqlCommand(qry,conn);

                            DataSet ds=new DataSet();

                            da.Fill(ds,"employees");

                            DataTabledt=ds.Tables["employees"];

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

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

                            foreach(DataRowrow in dt.Rows)

                            {

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

                            }

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

                            SqlCommandcmd=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(Exceptionex)

                     {

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

                     }

 

              ***B)InsertCommand属性

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

                     staticvoid Main()

                     {

                     stringConnectionString =@"data source=localhost;initial catalog=northwind;userid =sa;password=sa";

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

                     stringins=@"

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

                    values

                     (

                            @firstname,

                            @lastname,

                            @titleofcourtesy,

                            @city,

                            @country

                     )

                     ";

                     SqlConnectionconn =new SqlConnection(ConnectionString);

                     try

                     {

                            SqlDataAdapterda=new SqlDataAdapter();

                            da.SelectCommand=newSqlCommand(qry,conn);

                            DataSetds =new DataSet();

                            da.Fill(ds,"employees");

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

                            DataRownewRow =dt.NewRow();

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

                            newRow["firstname"]="li";

                            newRow["lastname"]="yong";

                            newRow["titleofcourtesy"]="Sir";

                            newRow["city"]="Birmingham";

                            newRow["country"]="UK";

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

 

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

                            {

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

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

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

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

                                          );

                            }

                           

                            SqlCommandcmd =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(Exceptionex)

                     {

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

                            Console.ReadLine();

                           

                     }

                     finally

                     {

                            conn.Close();

                     }

                    }

 

              ***C)DeleteCommand属性

              DeleteCommand属性可用于执行SQLDELETE语句。

             

              staticvoid Main()

              {

                     stringConnectionString =@"data source =localhost;initial catalog=northwind;userid =sa;password=sa;";

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

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

                     SqlConnectioncon=new SqlConnection(ConnectionString);

                     try

                     {

                            //注释: 虽然这段代码用的delete语句用到了参数whereemployeeid =@employeeid

                               //但是在下面又用到了filt 筛选条件 所以明确了用名字来判断 那么where employeeid =@employeeid就没有意义了

                            SqlDataAdapterda=new SqlDataAdapter();

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

                            DataSetds=new DataSet();

                            da.Fill(ds,"employees");

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

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

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

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

                            foreach(DataRowrow in dt.Select(filt))

                            {

                                   row.Delete();

                            }

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

                            da.DeleteCommand=cmd;

                            da.Update(ds,"employees");

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

                            foreach(DataRowrow in dt.Rows)

                            {

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

                            }

                            Console.ReadLine();

                     }

                     catch(Exceptionex)

                     {

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

                     }

                     finally

                     {

                            con.Close();

                     }

              }

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

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

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

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

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

 

             

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

 

C:\Inetpub\AdminScripts> adsutil.vbscreate_vserv W3SVC/2

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

[到9了]

 

删除:

 

C:\Inetpub\AdminScripts> adsutil.vbsdelete W3SVC/2

 

List:

 

C:\Inetpub\AdminScripts> adsutil.vbsenum w3svc /p

 

当然,创建了以后也只能同时运行一个。            

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值