【问题标题】:can't insert a record into table无法在表中插入记录
【发布时间】:2008-10-19 09:58:51
【问题描述】:

我编写了一个程序,其中包括从数据库写入和读取。当我运行应用程序并尝试执行写入时,我调用以下方法:

public static void AddMessage(string callID, string content)
    {
        string select =
            "INSERT INTO Sporocilo (oznaka_klica, smer, vsebina, prebrano, cas_zapisa) VALUES (@callId, 0, @content, 0, @insertTime)";
        SqlCommand cmd = new SqlCommand(select, conn);
        cmd.Parameters.AddWithValue("callId", callID.ToString());
        cmd.Parameters.AddWithValue("content", content);
        cmd.Parameters.AddWithValue("insertTime", "10.10.2008");
        try
        {
            conn.Open();
            cmd.ExecuteScalar();
        }
        catch(Exception ex)
        {
            string sDummy = ex.ToString();
        }
        finally
        {
            conn.Close();
        }
    }

在方法调用之后,我从表中读取所有记录并在表单中显示它们。可以看到刷新之前插入的记录,但是当我退出应用程序并查看表格时,我没有看到记录。

有谁知道什么会导致这种行为?

【问题讨论】:

  • 似乎有一个异常,你抓住了它。尝试调试并检查 ex.Message

标签: c# sql mdf


【解决方案1】:

在此之后您是否正在执行提交?它可能正在运行您的语句,但没有提交更改并进行隐式回滚。

我认为异常处理看起来很狡猾。除非你能以某种方式实际处理它,否则捕捉东西是没有意义的。框架的顶层是捕获和报告意外异常的地方。

【讨论】:

    【解决方案2】:

    您是否尝试过将 ExecuteScalar 方法的返回值设置为 int,然后对照表检查值?

    ExecuteScalar-

    执行查询,并返回查询返回的结果集中第一行的第一列。其他列或行被忽略

    public static int AddMessage(string callID, string content)
        {
            Int32 newProdID = 0
            string select =
                "INSERT INTO Sporocilo (oznaka_klica, smer, vsebina, prebrano, cas_zapisa) VALUES (@callId, 0, @content, 0, @insertTime); SELECT CAST(scope_identity() AS int);";
            SqlCommand cmd = new SqlCommand(select, conn);
            cmd.Parameters.AddWithValue("callId", callID.ToString());
            cmd.Parameters.AddWithValue("content", content);
            cmd.Parameters.AddWithValue("insertTime", "10.10.2008");
            try
            {
                conn.Open();
                newProdID = (Int32)cmd.ExecuteScalar();
            }
            catch(Exception ex)
            {
                string sDummy = ex.ToString();
            }
            finally
            {
                conn.Close();
            }
            return (int)newProdID
        }
    

    【讨论】:

    • INSERT 不返回结果集。
    • 抱歉,忘记在 INSERT 之后添加 SELECT 语句。现已更新
    • 主要问题是 ConnectionString 而不是 ExecuteScalar() 方法
    • 使用这个方法,你可以通过评估返回值来查看数据是否被插入。
    【解决方案3】:

    我发现了问题。我修改了自动生成的连接字符串

    connectionString="数据 源=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\URSZRDB.mdf;集成 安全=真;用户实例=真"

    与

    connectionString="数据 源=.\SQLEXPRESS;AttachDbFilename=C:\Users\Niko\Documents\Visual Studio 2008\Projects\URSZRWAPChat\URSZRWAPChat\URSZRDB.mdf;集成 安全=真;用户实例=真"

    现在它可以工作了。

    这不是我第一次写这样的程序,到目前为止一切都很顺利......

    【讨论】:

      猜你喜欢
      • 2015-10-09
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多