C#中使用ExecuteReader, ExecuteNonQuery, ExecuteScalar

ExecuteReader:可以读一个表的记录,只能读不能写

ExecuteNonQuery:可以写也可以读

ExecuteScalar:只能读一条记录,一般用来判断数据库是否有数据等,只能读不能写

ExecuteNonQuery():这个可以让我们在更新数据库时不使用 DataSet 而使用 ExecuteNonQuery 更改数据库中的数据。通过执行 UPDATEINSERTDELETE SQL语句就 可以达到更改数据库中的数据目的。即使 ExecuteNonQuery 不返回任何行,映射到参数的输 出参数或返回值仍然使用数据填充。但对于 UPDATE、INSERT 和 DELETE SQL语句,返回的 值就是受ExecuteNonQuery()命令影响的行数。对其它类型的语句以及回退来说,返回的值 都是 -1。

public void CreateDatabaseAsCopy(string sourceDatabase, string destDatabase, string connectionString)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = string.Format(RestoreSQLString, destDatabase, sourceDatabase);
                    cmd.ExecuteNonQuery();
                    Logger.Info(string.Format("Create database {0} as copy of {1}", destDatabase, sourceDatabase));
                }
            }
        }
View Code

   ExecuteReader():我们通常在asp中用Recordset对象来从数据库中读出数据,并且用 循环语句来一个一个的读出数据,但在我们的ADO.NET中,我们就是用DataReader 对象的 ExecuteReader()方法来进行数据的列出,并且我们用这个ExecuteReader()方法来显示数据 是最快的一种方法,因为当我们在用ExecuteReader()方法中的DataReader 对象来进行数据显示时,他只可以一条一条向前读,不能返回,也就是像ASP中的ADO方法 中的Recordset 对象的Movenext一样,他没有move -1这样的返回方法。

private const string CheckDatabaseFullName = "Select name from sys.databases where create_date>@datetime and name like N'PartitionMaster_Backup%' order by create_date";

public string GetBackupedPartitionMasterDatabase()
        {
            using (SqlConnection conn = new SqlConnection(MasterConnectionString))
            {                
                DateTime dt = DateTime.Now.AddHours(-12).ToUniversalTime();                
                conn.Open();
                string name = null;
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    //cmd.CommandText = string.Format(CheckDatabaseFullName, database);
                    cmd.CommandText = CheckDatabaseFullName;
                    cmd.Parameters.Add("@datetime", SqlDbType.DateTime);
                    cmd.Parameters[0].Value = dt;

                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            name = reader["name"].ToString();
                            Logger.Info(string.Format("Database: {0} exists", name));
                        }
                    }
                }

                return name;
            }
        }
View Code

    ExecuteScalar():这种CMD相当于我们在ADO中用SQL语句中使用一些计算函数的功 能一样,在这里我们只是返回所有影响的行数的第一行第一列数据,这样也就是相当于专业 为我们的如:select count(*) from database的功能一样,我们可以用

string sql="select * from  table"

SqlCommand cmd=SqlCommand(sql,conn)

int i=(int)cmd.ExecuteScalar()

这样我们的局部变更i的值就是与上面我的功能一样.

public int FindId()
        {
            var sqlSb = this.LoadConnectionString();
            using (var connection = new SqlConnection(sqlSb.ConnectionString))
            {
                connection.Open();
                using (var cmmd = new SqlCommand(
                    string.Format("select top 1 ID from [table] where CustomerId = '{0}' order by uploadedDate desc", this.customerId),
                    connection))
                {
                    var cabId = (int)cmmd.ExecuteScalar();
                    return cabId;
                }
            }
        }
View Code

 

posted @ 2013-05-20 17:20  Binyao  阅读(2190)  评论(0编辑  收藏  举报