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

时间:2011-08-12 19:37:45

标签: c# sql sql-server-2008 datatable sql-update

使用SQL select语句来自Access数据库后台,我发现将数据推送到SQL Server数据库并更新记录涉及更多工作。我最初了解在SQL Server中添加记录需要一个包含INSERT命令的非常长的语句。这对我来说似乎是不必要的复杂,我不得不相信,今天使用.NET,它必须简单得多。

我已经研究并审核了DataTableDataSetSqlCommandSqlAdapters等几个代码示例。尽管我的代码实际上没有任何代码示例它没有错误。我已经经历了这些例子中的这么多突变,我正在向Stack Overflow寻求帮助。

这就是我想要做的事情。

  1. 连接到外部托管的SQL Server(有效!)
  2. 打开一个名为Dongles
  3. 的表格
  4. 使用序列号作为标准检查行。
  5. 如果存在,请更新记录。
  6. 如果没有,则添加新记录。
  7. 我提供了我使用的代码示例的最新变体。在运行代码之前,我手动将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);
    }
    

1 个答案:

答案 0 :(得分:4)

什么样的列是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)
{
    .......
}