无法向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提供一些帮助。

这就是我要做的。

  1. 连接到外部托管的SQL Server (works!)
  2. 打开一个名为Dongles的表
  3. 使用序列号作为标准检查一行。
  4. 如果存在,则更新记录
  5. 如果没有,则添加新记录。

我提供了我所使用的代码样本的最新变化。在运行代码之前,我手动向数据库添加了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);
}

无法向SQL Server表添加或更新简单行

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)
{
    .......
}