无法向SQL Server表添加或更新简单行
本文关键字:更新 简单 添加 SQL Server | 更新日期: 2023-09-27 18:05:41
来自Access DB背景使用SQL选择语句,我发现有更多的工作涉及到将数据推送到SQL Server数据库和更新记录。我最初的理解是在SQL Server中添加记录需要一个很长的语句,其中包括INSERT命令。对我来说,这似乎是不必要的复杂,我不得不相信,今天的。net,它必须更简单。
我研究和审查了DataTable
, DataSet
, SqlCommand
, SqlAdapters
等几个代码示例。尽管我的代码中没有错误,但它们都不适合我。我已经经历了这些例子的很多变化,所以我呼吁Stack Overflow提供一些帮助。
这就是我要做的。
- 连接到外部托管的SQL Server (works!)
- 打开一个名为
Dongles
的表 - 使用序列号作为标准检查一行。
- 如果存在,则更新记录
- 如果没有,则添加新记录。
我提供了我所使用的代码样本的最新变化。在运行代码之前,我手动向数据库添加了1条记录,这样我就知道SerialNumber参数是否匹配。不幸的是,if (dt.Rows.Count > 0)
语句返回false,并且从未尝试更新。
现在我要告诉你....我还尝试了其他的一些突变,它们确实成功地通过了更新每个字段的行。但是当Update()函数被(成功地)调用时,没有任何内容被传播到实际的数据库。
代码如下:
SqlCommand cmd = new SqlCommand("SELECT * FROM Dongles WHERE SerialNumber = " + m_dongle.SerialNumber, server.SQLConnection);
SqlDataAdapter da = new SqlDataAdapter(cmd);
SqlCommandBuilder cb = new SqlCommandBuilder(da);
DataTable dt = new DataTable();
da.Fill(dt);
if (dt.Rows.Count > 0)
{
dt.Rows[0]["IsLeased"] = m_dongle.IsLeased == true ? 1 : 0;
dt.Rows[0]["LeaseDaysRemaining"] = m_dongle.LeaseDaysRemaining;
dt.Rows[0]["DateAssigned"] = DateTime.Now;
dt.Rows[0]["ConfiguredBy"] = m_dongle.ConfiguredBy;
dt.Rows[0]["LicenseHolder"] = m_dongle.LicenseHolder;
dt.Rows[0]["ContactName"] = m_dongle.ContactName;
dt.Rows[0]["ContactPhone"] = m_dongle.ContactPhone;
dt.Rows[0]["ContactEmail"] = m_dongle.ContactEmail;
dt.Rows[0]["SerialNumber"] = m_dongle.SerialNumber;
dt.Rows[0]["IsNetworkDongle"] = m_dongle.IsNetworkDongle;
dt.Rows[0]["NetworkMaxUsers"] = m_dongle.NetworkMaxUsers;
dt.Rows[0]["NetworkAbsoluteMaxUsers"] = m_dongle.NetworkAbsoluteMaxUsers;
dt.Rows[0]["IsAssigned"] = m_dongle.IsAssigned;
dt.Rows[0]["DongleModel"] = m_dongle.DongleModel;
dt.Rows[0]["SalesforceID"] = m_dongle.SalesforceID;
da.Update(dt);
MessageBox.Show("Dongle profile updated successfully.", "Profile Saved",
MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
SerialNumber
是什么类型的列??如果它是一个字符串列,您需要在参数周围加上引号-当您使用它时,为了防止SQL注入攻击-使用参数化查询而不是将SQL语句连接在一起…(作为一个额外的好处,参数将在需要的地方自动在值周围使用引号):
SqlCommand cmd = new SqlCommand("SELECT * FROM Dongles WHERE SerialNumber = @SerialNo", server.SQLConnection);
cmd.Parameters.Add("@SerialNo", SqlDbType.VarChar, 50).Value = m_dongle.SerialNumber.Trim();
SqlDataAdapter da = new SqlDataAdapter(cmd);
SqlCommandBuilder cb = new SqlCommandBuilder(da);
DataTable dt = new DataTable();
da.Fill(dt);
if (dt.Rows.Count > 0)
{
.......
}