第一节 数据库连接
1、创建连接
数据库连接使用SqlConnection。
创建SqlConnection实例:
SqlConnection conn = new SqlConnection();
创建实例后,可用SqlConnection.ConnectionString属性给连接配置连接字符串:
conn.ConnectionString = “<Connection String>”;
2、连接状态
只有在连接打开时才能访问数据库。然而,数据库连接消耗资源,因此应该只在使用数据库时才打开连接,在其他时候应该关闭连接。否则应用程序可能会引起内存泄漏。连接的状态可通过SqlConnection.State属性来判断。该属性包含ConnecState枚举中的一个值。
使用SqlConnection.Open()方法打开连接。使用完连接时,可用SqlConnection.Close()方法关闭它。
第二节 数据库命令
1、创建命令
SqlCommand对象通过SqlConnection对象对数据库执行命令。
2、命令类型
(1)CommandType.Text:默认类型。指定CommandText属性为SQL命令。
(2)CommandType.StoreProcedure:该值表示CommandText包含存储过程的名称。
(3)CommandType.TableDirect:使用该值时,CommandText应该为表或视图的名称。命令执行时,返回指定表中的所有行和所有列。
3、执行命令的方法
可以用于执行命令的方法如下:
(1)ExecuteNonQuery():命令不返回结果时,使用该方法。该方法适用于Insert、Update、Delete。实际上该方法有一个返回值,其值为int,表示命令影响的行数。
(2)ExecuteReader():命令返回数据时,使用该方法。这包含大多数的Select命令、表直接命令和很多存储过程。该方法返回一个SqlDataReader类型的对象。
(3)ExecuteScalar():返回任意类型的结果时,使用该方法。
(4)ExecuteXmlReader():如果执行的命令返回XML数据,可以使用该方法来获取XmlReader对象以访问数据。这只适用于单行数据,如果命令返回多行,第一行后的所有行都不能通过XmlReader访问。
对于ExecuteReader(),可以指定命令对象要使用的命令行为。为此,可以指定一个或多个CommandBehavior枚举的值。
CommandBehavior.Default:没有影响,结果为默认行为。
CommandBehavior.CloseConnection:使用该行为时,当数据阅读器关闭时连接也将关闭。
CommandBehavior.KeyInfo:该选项意味着更多的信息可以作为查询的一部分获得。如果要使用命令查看表的架构,可以使用该选项。
CommandBehavior.SchemaOnly:使用该选项,只返回架构信息,而不返回真正的数据。该选项常与CommandBehavior.KeyInfo结合使用,获取完整的架构信息。
CommandBehavior.SequentialAccess:确保数据只能以串行方式访问。也就是说必须按数据返回的顺序访问它们。
CommandBehavior.SignalResult:通知SQL提供程序命令只能返回一个结果。
4、参数化命令
执行SQL语句时,完全可以将语句的所有信息包含在命令的CommandText属性中。然而,将SQL语句的某些部分参数化通常很有帮助。这不仅有助于防止SQL注入攻击,也有助于复用命令。
要在SQL语句中使用参数,需要在命令文本提供占位符。占位符是前缀为字符@的变量。例如:
SELECT * FROM MyTable WHERE MyId = @MyId
其中,@MyId表示一个参数。
要使用参数化命令,必须在SqlCommand.Parameters集合中添加相应的参数,该集合是SqlParametersCollection类的一个实例,包含SqlParameter对象。使用SqlParametersCollection.Add()方法添加参数,可以通过传递预配置的参数或指定要添加的参数的属性实现。
配置参数后,可以使用SqlParameter.Value属性来设置它的值。由于SqlParametersCollection.Add()方法返回对添加的参数的引用,因此通常在同一行代码中设置参数的值。
例如:
SqlCommand cmd = new SqlCommand(“SELECT * FROM MyTable WHERE MyId = @MyId”,conn);
cmd.Parameters.Add(“@MyId”,SqlDbType.UniqueIdentifier).Value = MyGuidVal;
使用这种方法时,添加的是输入参数,若要使用输出或双向参数,应独立的实例化参数并配置属性。例如:
SqlParameter myParam = new SqlParameter(“@MyOutputParam”,SqlDbType.Int);
myParam.Direction = ParameterDirection.Output;