更正:修改了SqlCommand中关于Parameters属性的内容,现在源代码不再会出现IndexOutOfRangeException这个异常了
一、SqlConnection
C#使用SqlConnection创建程序到数据库的连接,可以通过using来限定连接的使用范围,并在代码执行结束后自动关闭打开的连接。
using(SqlConnection conn = new SqlConnection(connString))
{
// 此处必须先使用Open()方法以打开连接
conn.Open();
// 在此处插入代码片
// connString表示数据库的连接字符串
}
二、SqlCommand
SqlCommand代表sql语句的执行,同PreparedStatament有异曲同工之妙。可以在创建其对象时就通过构造方法传递sql语句和SqlConnection对象,也可以通过无参构造方法创建对象,通过CommandText属性和Connection属性自行调整sql语句内容和连接对象。
using(SqlConnection conn = new SqlConnection(connString))
{
// connString表示数据库的连接字符串
conn.Open();
string sql = "SELECT * FROM [dbo].[Users] WHERE Account = @Account AND Password = @Password;";
SqlCommand cmd = new SqlCommand(sql, conn);
// 或者这么写:
cmd = new SqlCommand()
{
CommandText = sql,
Connection = conn
};
// 此处的user是一个Users类对象,它有Account、Password和Name三个属性
// 在为sql中的参数赋值之前,必须先调用Add方法将参数添加进集合中,否则会出现IndexOutOfRangeException异常
cmd.Parameters.Add("@Account", SqlDbType.VarChar);
cmd.Parameters["@Account"].Value = user.Account;
cmd.Parameters.Add("@Password", SqlDbType.VarChar);
cmd.Parameters["@Password"].Value = user.Password;
// 在此处插入剩余代码片...
}
SqlCommand也同样支持参数化编程,我们可以通过调用Parameter属性的AddWithValue方法为sql语句中的参数复制,这个方法要比java里的set系列方法来得好用一些,因为它会自己帮你处理数据类型。
三、SqlDataReader
SqlDataReader的作用与ResultSet类似,它提供了一种只能逐行向下读取数据库数据的方式,它不可继承。(Provides a way of reading a forward-only stream of rows from a SQL Server database. This class cannot be inherited.)
虽然读起来很拗口,但SqlDataReader的用法其实很好理解:它和ResultSet一样,使用一种只能单向前进的游标逐行扫描执行sql语句后返回的结果集,在java中我们使用next方法让游标前进,在C#中我们使用Read方法来完成同样的效果。我们同样也可以使用GetString(int index)方法读取当前行第index列的数据,这个java里的getString方法一模一样毫无二致。以下是一段demo:
public static Users ReadOrderData(string connectionString, Users user)
{
using (SqlConnection conn = new SqlConnection(connString))
{
string sql = "SELECT * FROM [dbo].[Users] WHERE Account = @Account AND Password = @Password;";
conn.Open();
SqlCommand cmd = new SqlCommand()
{
CommandText = sql,
Connection = conn
};
cmd.Parameters.Add("@Account", SqlDbType.VarChar);
cmd.Parameters["@Account"].Value = user.Account;
cmd.Parameters.Add("@Password", SqlDbType.VarChar);
cmd.Parameters["@Password"].Value = user.Password;
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
System.Data.IDataRecord record = reader;
user.UserName = record.GetString(2);
return user;
}
}
return null;
}
}
其实操作大体上和Java差不多,除了名字换了一下之外基本没什么太大区别……当然也可能是因为我用的浅的缘故吧。