C#中关于数据库的一些操作

更正:修改了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差不多,除了名字换了一下之外基本没什么太大区别……当然也可能是因为我用的浅的缘故吧。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值