C#中使用ExecuteReader, ExecuteNonQuery, ExecuteScalar
ExecuteReader:可以读一个表的记录,只能读不能写
ExecuteNonQuery:可以写也可以读
ExecuteScalar:只能读一条记录,一般用来判断数据库是否有数据等,只能读不能写
ExecuteNonQuery():这个可以让我们在更新数据库时不使用 DataSet 而使用 ExecuteNonQuery 更改数据库中的数据。通过执行 UPDATE、INSERT 或 DELETE 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)); } } }
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; } }
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; } } }