1.使用这段代码保证能连接到数据库。
string dataDir = AppDomain.CurrentDomain.BaseDirectory;
if (dataDir.EndsWith(@"\bin\Debug\")
|| dataDir.EndsWith(@"\bin\Release\"))
{
dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
AppDomain.CurrentDomain.SetData("DateDirectory", dataDir);
}
对这段代码的解释:http://blog.csdn.net/cai115/article/details/8630068
2.一个连接数据库的实例
using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True"))
{
conn.Open();
Console.WriteLine("打开数据库成功");
Console.ReadKey();
}
Console.WriteLine("请输入你的用户名");
string username = Console.ReadLine();
Console.WriteLine("请输入你的密码");
string password = Console.ReadLine();
string connstr = @"Data Source=.\SQLExpress;Integrated Security=true;AttachDBFilename=|DataDirectory|Database1.mdf;Initial Catalog=Database1.mdf2";
SqlConnection conn = new SqlConnection(connstr);
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn; //这里要把connection对象链接到command。
cmd.CommandText = "Insert into Table1 (UserName,PassWord) values ('" + username + "','" + password + "')";//这种情况下要用拼接字符串。
cmd.ExecuteNonQuery(); //执行非select语句
cmd.CommandText = "select count(*) from Table1";
Console.WriteLine(cmd.ExecuteScalar()); //返回第一行第一列的数据。
cmd.Dispose();
conn.Close();
Console.WriteLine("关闭成功");
相关的ado.net的知识参考http://www.cnblogs.com/liuhaorain/archive/2012/02/06/2340409.html
3.
executereader()返回一个sqldatareader对象,这个对象有read()这个方法来历遍记录。read()方法将行游标移动到下一个记录,如果是第一次调用,将移动到第一条记录。每循环一次时,read()方法将返回一个布尔值,当还有其他行时,read()方法返回true,如果已经是最后一行,则返回false,并结束循环。所以要结合while{reader.read()}来使用。可以理解为read()方法是一行一行地读取。
调用sqldatareader对象的read()方法来遍历记录之后,就可以通过如下两种方法来获取datareader对象的值了
1.使用dr.GetString(index)或者dr[index].ToString()的方式。
2.使用dr["字段名"].ToString()的方式。
3.使用dr.GetOrdinal("字段名")来获取字段名所在的列,然后用dr.GetString()来获取记录。合并起来可以为dr.GerString(dr.GetOrdinal("字段名"))
read()方法只能一行一行往下读,不能返回也不能跳进。
同GetString相同的原理有GetDateTime、GetDouble、GetGuid、GetInt32 等方法。
4.连接池:
可以将连接池看成是已打开的及可重用的数据库所连接的一个容器,也可看成是程序与数据库之间的一个连接。程序与连接池之间是一个逻辑连接,连接池与数据库之间是一个物理连接。当连接字符串传递到连接池里面是,连接池创建一个物理连接,然后调用conn.open()可以建立一个逻辑连接。当用close()时候,实际上是断开与连接池的连接,再使用conn.open()可以继续连接上连接池。当用dispose()的时候,实际上是断开物理连接还有逻辑连接,这时候用conn.open()是不能重新连接的。 这也是close()和dispose()的区别。 如果不想使用连接池,则必须在连接字符串中指定“pooling=false”. using在出了作用域以后调用Dispose(),SqlConnection,FileStream等的Dispose内部都会中这样的判断:判断有没有close(),如果没有Close就先Close后在Dispose。
5.参数化查询,sqlcommand.parameters是command语句中参数(command中的参数是用@name形式来表示)的一个集合,对参数的赋值可以避免sql攻击。
有三种形式:cmd.parameters.addwithvalue(“@name”,name);
或者是另外一种形式:cmd.parrmeters.add(new parameter(“@name”,name))
或者是cmd.parameters.add(“@name”,sqltype.int); cmd.parameters[“@name”].value=name;
6.获取datareader中行的数据有下面三种方法:
一.使用列名索引器。 如myDr[“NewsID”],访问NewsID列
二.使用序数索引器。假如程序中查询了两个列NewsID和NewsContent,按照列索引顺序,myDr[0]访问NewsID,myDr[1]访问NewsContent列
三.使用类型访问器。类型访问器方法都以Get开始,后面跟各种数据类型,参数为列的序数索引号。如访问字符串类型的NewsContent列,语法如下:myDr.GetString(1)
这3种访问列的方法中,以类型访问器速度最快,序数访问器其次,列名访问法最慢,但列名访问法在编程中灵活性最高,直观的列名很容易记住,便于维护。
一个使用datareader的例子:
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
String cityName=reader.GetString(reader.GetOrdinal("cityName"));
cmb市.Items.Add(cityName);
}
7.DataSet相当于内存中的一个小型的关系型数据库,一个DataSet对象包括一组DataTable对象集合,这些对象可以与DataRelation对象相关联,其中,每个DataTable对象是由DataColumn和DataRow对象组成的。创建DataSet的代码:
stringconnStr=ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
string cmdtxt= "select * from Person";
DataSet dt = new DataSet();
SqlDataAdapter sa = new SqlDataAdapter(cmdtxt,conn);
sa.Fill(dt,"person");//创建一张新表用来储存返回的数据。
DataTable Dtable=dt.Tables["person"];
for (int i = 0; i < Dtable.Rows.Count; i++)
{
DataRow dr = Dtable.Rows[i];
string name = dr["Name"].ToString();
MessageBox.Show(name);
}
}
}
使用dataset中的数据更新数据库
使用sqlcommandbuilder类将dataset的更新与sql server数据库相协调,dataset被更改后,sqlcommandbuilder会自动生成更新用的sql语句。例如:
SqlConnection myConn=GetConnection();
myConn.Open();
String sqlStr=”select * from tb_News”;
SqlDataAdapter myDa=new SqlDataAdapter(sqlStr,myConn);
//创建DataSet对象
DataSet myDs=new DataSet();
//创建sqlcommandbuilder对象,并和SqlDataAdapter关联
SqlCommandBuilder builder=new SqlCommandBuilder(myDa);
myDa.Fill(myDs,”News”);
for(int i=0;i<=myDs.Tables[“News”].Rows.Count-1;i++)
{
myDs.Tables[“News”].Rows[i][“NewsContent”]=SubStr(Convert.ToString(myDs.Tables[“News”].Rows[i][“NewContent”]),5);
}
myDa.Update(myDs,”News”);//通过DataAdapter对象的Update()方法实现更新。
8.关于数据库连接字符串的问题。
连接字符串中,有些字符串是相同的作用但是有不同的写法。像
服务器声明initial catalog和database是相同的,还有Address、Addr和Network Address,五个词都是相同的。
数据库声明Datasource和server也是相同的,不过推荐datasource,是标准写法。
集成Windows账号的安全性声明 Integrated Security和Trusted_Connection等
使用数据库账号的安全性声明 User ID和Password等。