【问题标题】:Where have I gone wrong with this c# simple sql insert这个 c# simple sql insert 我哪里出错了
【发布时间】:2011-07-21 18:25:27
【问题描述】:

最后说明:在我将连接字符串从 Filename=|DataDirectory|\testconn.mdf 更改为 Filename=c:\Documents.. 之后添加了 executeNonQuery AND。 ......\testconn.mdf。我的数据开始插入到我的表中。谢谢大家的帮助。

在使用这个 sql insert 时,我发现代码运行时没有任何异常,但是在进入数据库资源管理器并查看显示表数据之后,数据没有被插入。最初我没有使用事务代码,但在这个站点上阅读这可能是它也无异常运行但实际上仍然没有插入表的问题。在单步执行时,我可以看到在 conn.Open() 和 connClose() 语句之后状态从 open 变为 close 的位置。除了最佳实践之外,是否有一种更清洁/更好的方法来编写我的 SqlConnection 字符串以及我的 SqlCommand 字符串?谢谢我的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Transactions;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        public Form1()
        {

            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            CommittableTransaction MASTER_TRANSACTION = new CommittableTransaction();
            // 1. Instantiate the connection
            SqlConnection conn = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\testconn.mdf;Integrated Security=True;User Instance=True");


                  try
            {
                // 2. Open the connection
                conn.Open();
                conn.EnlistTransaction(MASTER_TRANSACTION);

                // 3. Pass the connection to a command object
               SqlCommand cmd = new SqlCommand("INSERT INTO Client_Master(Client_ID, Client_First, Client_Last) VALUES('2', 'Joe', 'Shmoe')", conn);
                MASTER_TRANSACTION.Commit();

            }
            finally
            {

             conn.Close();

            }
        }

    }
}

【问题讨论】:

  • Client_Master的架构是什么?

标签: c# .net sql


【解决方案1】:

你的 cmd 是:

INSERT INTO Client_Master(Client_ID, Client_First, Client_Last) 
                   VALUES('2', 'Joe', 'Shmoe'). 

我认为问题就在这里。与 Client_ID 列。您已将此列设置为主键。但是您每次都要插入“2”。因此它给了你

   System.Data.SqlClient.SqlException was caught Message=Violation of PRIMARY KEY
 constraint 'PK_Client_Master'. Cannot insert duplicate key in object dbo.Client_Master.

您可以将 Client_ID 列设为自动增量

【讨论】:

  • 感谢您的回复。问题是记录永远不会被插入到表中。我只在同一个调试会话期间收到该错误。如果我停止调试并再次运行它,第一次通过它运行良好。如果我再次按下按钮,我会收到错误消息。但在任何时候,记录都不会真正插入到记录中。所以我很难过。但我感谢您的意见。
【解决方案2】:

尝试在“try”和“finally”中添加“catch”块,以便查看是否发生错误。

目前,您缺少该语句的实际执行。添加以下内容来解决这个问题:

cmd.ExecuteNonQuery();

另外,你为什么要使用事务?事务在执行多个语句以确保“全部或无”执行时很有用。您只是插入一行。

【讨论】:

    【解决方案3】:

    您正在创建命令,但没有对它执行任何操作。你错过了一个:

    cmd.ExecuteNonQuery();
    

    此外,您应该考虑使用 using 语句封装连接,因为它会自动处理它,例如:

    using(SqlConnection conn = new SqlConnection(connectionString))
    {
    
    
    }
    

    【讨论】:

      【解决方案4】:

      您需要执行 SQL 命令。试试

      cmd.ExecuteNonQuery()
      

      【讨论】:

        【解决方案5】:

        你必须执行你的命令。即

         // 3. Pass the connection to a command object
                   SqlCommand cmd = new SqlCommand("INSERT INTO Client_Master(Client_ID, Client_First, Client_Last) VALUES('2', 'Joe', 'Shmoe')", conn);
                   cmd.ExecuteNonQuery();
                    MASTER_TRANSACTION.Commit();
        

        点击此处了解更多信息。 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx

        【讨论】:

          【解决方案6】:

          是的,执行 cmd 然后在“finally”行之前添加:

           catch (Exception ex) {
              MessageBox.Show(ex.Message);
          } 
          

          如果有的话,它会显示其他异常。

          而且你真的不需要单次插入的事务开销......如果你这样做了,你应该在 Exception 块中进行回滚。

          【讨论】:

          • 谢谢我按照建议进行了这些更改。仍然没有可见的插入到表中,但如果我再次尝试这样做,我会抛出主键异常,有什么想法吗?
          • 如果 Client_ID 是您的主键 (?),则表中已经有一行带有“2”。谷歌搜索“身份列”,然后使用其中之一。因此,您不会在插入语句中指定 Client_ID。
          • 对不起,我想我不清楚。例如,如果我尝试输入的下一条记录是 Client_ID 4 .... 一旦运行代码,该记录就不会显示在表中,如果我再次运行代码,将 4 作为 Client_ID 它将引发异常.就像数据在那里但没有显示在表格中一样。
          • 你只需要在插入后刷新你的数据,它就会在那里。
          • 谢谢,我会在另一台机器上试试。这只是行不通。大声笑的人给了我反对票,所以我会继续前进。
          【解决方案7】:

          尝试cmd.ExecuteNonQuery()执行SQL命令

          MSDN Link

          【讨论】:

            【解决方案8】:

            您还需要通过cmd.ExecuteNonQuery() 执行命令。

            【讨论】:

              【解决方案9】:

              我认为您需要在 command 对象上调用执行方法。

              【讨论】:

                【解决方案10】:

                尝试调用

                cmd.ExecuteNonQuery();
                

                MASTER_TRANSACTION.Commit();之前

                【讨论】: