在 C# 中使用 SqlDataAdapter 更新数据库
Posted
技术标签:
【中文标题】在 C# 中使用 SqlDataAdapter 更新数据库【英文标题】:update database using SqlDataAdapter in C# 【发布时间】:2015-09-20 11:33:30 【问题描述】:我有以下代码可以在单击按钮时更新我的数据库表,但它不起作用。
protected void Button_Click(object sender, EventArgs e)
HasinReservation.Entities.Db.Transaction dt = new Transaction();
SqlConnection connection = new SqlConnection(
@"Data Source=192.x.x.x\Sql2008;Initial Catalog=GardeshgariKish;User ID=cms;Password=xxxxx;MultipleActiveResultSets=True;Application Name=EntityFramework");
connection.Open();
SqlCommand sqlCmd = new SqlCommand(
"Update Transaction SET IsCancelled = 1 WHERE BarCodeNumber = @Value1", connection);
SqlDataAdapter sqlDa = new SqlDataAdapter(sqlCmd);
string barcode = dgvData.Rows[0].Cells[12].Text;
sqlCmd.Parameters.AddWithValue("Value1", barcode);
connection.Close();
【问题讨论】:
你不应该提交你的交易吗? 在这里看不到 EF 的任何部分。SqlDataAdapter
是 ADO.NET 的一部分,用于旧的数据库驱动应用程序。它用于连接断开的部分(DataTable
、DataSet
)和数据库。如果您不将数据存储在DataTable
或DataSet
中,则不要使用SqlDataAdapter
。 SqlCommand
就是你所需要的。
【参考方案1】:
我对您的实体框架实现感到困扰,但后来没有使用该框架来实现它的设计......
你已经配置了你的数据适配器和命令,甚至打开了连接……但你并没有真正执行命令。
sqlCmd.ExecuteNonQuery();
我知道您的实际业务逻辑可能已经被这个简单的 CRUD 操作所取代,但我们使用实体框架的主要原因是避免在我们的业务逻辑中编写任何 T-SQL。为什么不使用框架来提交更改:
protected void Button3_Click(object sender, EventArgs e)
// cancel the selected transaction
string selectedBarcode = dgvData.Rows[0].Cells[12].Text;
using(var dataContext = new HasinReservation.Entities.Db())
var transaction = dataContext.Transaction.Single(t => t.Barcode == selectedBarcode);
transaction.IsCancelled = true;
dataContext.SaveChanges();
这本身可能不是一个很好的解决方案,但它使用框架来完成您尝试手动执行的操作。
【讨论】:
【参考方案2】:您为什么要尝试使用SqlDataAdapter
来执行UPDATE
语句?当使用SqlCommand
对象构造SqlDataAdapter
时,该命令对象代表适配器的SELECT
命令。 UPDATE
语句不选择任何内容,SELECT
命令不更新任何内容。
完全摆脱SqlDataAdapter
,只需执行命令:
sqlCmd.ExecuteNonQuery();
您可能还想添加一些错误处理,以便异常不会到达 UI(并确保在错误条件下正确关闭连接)。你似乎也没有对那个 Transaction
对象做任何事情,所以你也可以摆脱它。
【讨论】:
亲爱的大卫感谢您的关注,我忘记了我使用的是模型构建器实体框架而不是数据集。以上是关于在 C# 中使用 SqlDataAdapter 更新数据库的主要内容,如果未能解决你的问题,请参考以下文章
C# SqlDataAdapter.Fill 在传递数据表参数时给出关于数据转换的错误