2011-08-12 54 views
-5

使用SQL select语句从Access数据库背景中发现,我发现在将数据推送到SQL Server数据库和更新记录方面涉及更多工作。我最初在SQL Server中添加记录的理解需要包含INSERT命令的VERY LONG语句。这对我来说似乎是不必要的复杂,我必须相信,今天使用.NET,它必须更简单。无法添加或更新简单的行到SQL Server表

我已经研究和审查的几个代码示例DataTableDataSetSqlCommandSqlAdapters,等他们都没有,尽管我的代码中没有任何错误的情况为我工作。我已经经历了这些例子的很多突变,以致我对Stack Overflow有所帮助。

这是我正在做的。

  1. 连接到SQL Server外部托管(作品!)
  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); 
} 
+2

如果ado.net与数据表是太复杂了,你,你可以查一些ORM与例如实体框架工具,如果你喜欢一些神奇:) –

+3

嗨JD,**接受答案,请点击答案左边的复选框大纲**。人们会欣赏这一点,并将在未来更愿意提供帮助。和其他许多人一样,我确实为你提供了解决方案,但不会因为你没有回报而给它......抱歉 –

+0

尝试不使用where语句作为完整性检查。 –

回答

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) 
{ 
    ....... 
} 
相关问题