【发布时间】:2013-12-28 17:14:14
【问题描述】:
对于 SQL Server INSERT、UPDATE 和 DELETE 操作,请告知在 SqlCommand 和 SqlDataAdapter 之间进行选择。
让我们考虑一下 SQL Server 的以下代码 sn-p:
public int Execute(SqlCommand commandSql)
或
public int Insert(SqlCommand commandSql)
考虑到SqlCommand(Execute 方法)的明显优势是它可以用于所有 INSERT、UPDATE 和 DELETE 操作,而SqlDataAdapter(插入、更新、删除方法)的优势是断开连接的架构,使用SqlCommandExecuteNonQuery相对于SqlDataAdapterExecuteNonQuery有什么优缺点?
企业级 Web 应用程序的注意事项?请专家澄清一下。
请注意,这个问题与 LINQ 或实体框架无关,这是关于 SqlCommand ExecuteNonQuery 与 SqlDataAdapter ExecuteNonQuery 的对比?
重要问题:SqlCommand ExecuteNonQuery 使用连接架构还是非连接架构?
//Insert
private bool Insert(string firstName, string lastName, string synonym)
{
bool isInserted = false;
try
{
int rowsAffected = 0;
StringBuilder insertQuery = new StringBuilder();
insertQuery.Append("INSERT INTO Customer ");
insertQuery.Append("(");
insertQuery.Append("FirstName, ");
insertQuery.Append("LastName, ");
insertQuery.Append("Synonym ");
insertQuery.Append(") ");
insertQuery.Append("VALUES ");
insertQuery.Append("(");
insertQuery.Append("@FirstName, ");
insertQuery.Append("@LastName, ");
insertQuery.Append("@Synonym ");
insertQuery.Append(");");
using (SqlCommand commandSql = new SqlCommand(insertQuery.ToString()))
{
commandSql.Parameters.AddWithValue("@FirstName", firstName);
commandSql.Parameters.AddWithValue("@LastName", lastName);
commandSql.Parameters.AddWithValue("@Synonym", synonym);
DataAccessLayer dal = new DataAccessLayer();
rowsAffected = dal.Execute(commandSql); // SqlCommand ????
rowsAffected = dal.Insert(commandSql); // SqlDataAdapter ???
}
if (rowsAffected > 0)
{
isInserted = true;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
return isInserted;
}
//UPDATE
private bool Update(int custId, string firstName, string lastName, string synonym)
{
bool isUpdated = false;
try
{
int rowsAffected = 0;
StringBuilder updateQuery = new StringBuilder();
updateQuery.Append("UPDATE Customer ");
updateQuery.Append("SET ");
updateQuery.Append("FirstName = @FirstName, ");
updateQuery.Append("LastName = @LastName, ");
updateQuery.Append("Synonym = @Synonym ");
updateQuery.Append("WHERE ");
updateQuery.Append("CustomerId = @CustomerId;");
using (SqlCommand commandSql = new SqlCommand(updateQuery.ToString()))
{
commandSql.Parameters.AddWithValue("@CustomerId", custId);
commandSql.Parameters.AddWithValue("@FirstName", firstName);
commandSql.Parameters.AddWithValue("@LastName", lastName);
commandSql.Parameters.AddWithValue("@Synonym", synonym);
DataAccessLayer dal = new DataAccessLayer();
rowsAffected = dal.Execute(commandSql); // SqlCommand ????
rowsAffected = dal.Update(commandSql); // SqlDataAdapter ???
}
if (rowsAffected > 0)
{
isUpdated = true;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
return isUpdated;
}
//DELETE
private bool Delete(int custId)
{
bool isDeleted = false;
try
{
int rowsAffected = 0;
StringBuilder deleteQuery = new StringBuilder();
deleteQuery.Append("DELETE FROM Customer ");
deleteQuery.Append("WHERE ");
deleteQuery.Append("CustomerId = @CustomerId;");
using (SqlCommand commandSql = new SqlCommand(deleteQuery.ToString()))
{
commandSql.Parameters.AddWithValue("@CustomerId", custId);
DataAccessLayer dal = new DataAccessLayer();
rowsAffected = dal.Delete(commandSql);
rowsAffected = dal.Execute(commandSql); // SqlCommand ????
rowsAffected = dal.Delete(commandSql); // SqlDataAdapter ???
}
if (rowsAffected > 0)
{
isDeleted = true;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
return isDeleted;
}
// SqlCommand
public int Execute(SqlCommand commandSql)
{
int rowsAffected = 0;
using (SqlConnection connectionSql = new SqlConnection("ConnectionString"))
{
commandSql.Connection = connectionSql;
commandSql.Connection.Open();
rowsAffected = commandSql.ExecuteNonQuery();
}
return rowsAffected;
}
// SqlDataAdapter
public int Insert(SqlCommand commandSql)
{
int rowsAffected = 0;
using (SqlConnection connectionSql = new SqlConnection("ConnectionString"))
{
using (SqlDataAdapter dataAdapterSql = new SqlDataAdapter())
{
dataAdapterSql.InsertCommand = commandSql;
dataAdapterSql.InsertCommand.Connection = connectionSql;
dataAdapterSql.InsertCommand.Connection.Open();
rowsAffected = dataAdapterSql.InsertCommand.ExecuteNonQuery();
}
}
return rowsAffected;
}
// SqlDataAdapter
public int Update(SqlCommand commandSql)
{
int rowsAffected = 0;
using (SqlConnection connectionSql = new SqlConnection("ConnectionString"))
{
using (SqlDataAdapter dataAdapterSql = new SqlDataAdapter())
{
dataAdapterSql.UpdateCommand = commandSql;
dataAdapterSql.UpdateCommand.Connection = connectionSql;
dataAdapterSql.UpdateCommand.Connection.Open();
rowsAffected = dataAdapterSql.UpdateCommand.ExecuteNonQuery();
}
}
return rowsAffected;
}
// SqlDataAdapter
public int Delete(SqlCommand commandSql)
{
int rowsAffected = 0;
using (SqlConnection connectionSql = new SqlConnection("ConnectionString"))
{
using (SqlDataAdapter dataAdapterSql = new SqlDataAdapter())
{
dataAdapterSql.DeleteCommand = commandSql;
dataAdapterSql.DeleteCommand.Connection = connectionSql;
dataAdapterSql.DeleteCommand.Connection.Open();
rowsAffected = dataAdapterSql.DeleteCommand.ExecuteNonQuery();
}
}
return rowsAffected;
}
请帮忙。
谢谢
【问题讨论】:
-
您是否考虑过使用 LINQ to SQL 或实体框架?
标签: c# sql-server