【问题标题】:C# how to capture error and debugging prepared statements?C#如何捕获错误和调试准备好的语句?
【发布时间】:2015-12-04 16:39:04
【问题描述】:

大家好,下面是我的带有多个插入语句的 C# 代码的 sn-p。我将它们放入事务括号中,并使用准备好的语句。例如,我的挑战是我知道我现在在 cmdText3 中遇到了问题,但没有生成任何错误消息。在这种情况下,我应该在哪里添加额外的 try 和 catch 来帮助我调试并提醒我错误?我可以在准备好的语句中看到对数据执行的确切查询是什么吗?

myCon getMyCon1 = new myCon(); MySqlConnection con = getMyCon1.GetConnection();

    using (MySqlTransaction trans = con.BeginTransaction())
    {
        try
        {
            long rID = 0;
            String cmdText1 = "INSERT INTO record1(fiscalPeriod,financialYear) VALUES(@fiscalPeriod,@financialYear)";
            using (MySqlCommand cmd = new MySqlCommand(cmdText1, con, trans))
            {
                cmd.Parameters.AddWithValue("@fiscalPeriod", fiscalPeriod.SelectedValue);
                cmd.Parameters.AddWithValue("@financialYear", financialYear.SelectedValue);
                cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
                rID = cmd.LastInsertedId;
            }

            foreach (object line in linesC)
            {
                if (line.GetType() == typeof(TypeC))
                {
                    TypeC typesC = (TypeC)line;                           
                    String companyName = typesC.comName;                            
                    String periodStart = typesC.periodStart;
                    String periodEnd = typesC.periodEnd;                          

                    String cmdText2 = "INSERT INTO record2(rID,companyName,,periodStart,periodEnd,) VALUES(@rID,@companyName,@periodStart,@periodEnd)";
                    using (MySqlCommand cmd = new MySqlCommand(cmdText2, con, trans))
                    {
                        cmd.Parameters.AddWithValue("@rID", rID);
                        cmd.Parameters.AddWithValue("@companyName", companyName);                                
                        cmd.Parameters.AddWithValue("@periodStart", periodStart);
                        cmd.Parameters.AddWithValue("@periodEnd", periodEnd);                               
                        cmd.ExecuteNonQuery();
                        cmd.Parameters.Clear();
                    }
                }
            }

            foreach (object line in linesP)
            {
                if (line.GetType() == typeof(TypeP))
                {
                    TypeP typesP = (TypeP)line;
                    String supplierName = typesP.supName;                          
                    String invoiceDate = typesP.invoiceDate;
                    String invoiceNo = typesP.invoiceNo;

                    String cmdText3 = "INSERT INTO record2(rID,supplierName,invoiceDate,invoiceNo) VALUES(@rID,@supplierName,@invoiceDate,@invoiceNo,)";
                    using (MySqlCommand cmd = new MySqlCommand(cmdText3, con, trans))
                    {
                        cmd.Parameters.AddWithValue("@rID", rID);
                        cmd.Parameters.AddWithValue("@supplierName", supplierName);
                        cmd.Parameters.AddWithValue("@invoiceDate", invoiceDate);
                        cmd.Parameters.AddWithValue("@invoiceNo", invoiceNo);
                        cmd.ExecuteNonQuery();
                        cmd.Parameters.Clear();
                    }
                }

            }
            trans.Commit();                    
        }
        catch (Exception ex)
        {
            trans.Rollback();
        }
    }
    con.Close()

【问题讨论】:

    标签: c# mysql prepared-statement


    【解决方案1】:

    您可以使用 Sql Profiler 应用查看确切的查询。这将允许您查看生成的查询和来自 Sql Server 的响应。

    https://msdn.microsoft.com/en-us/library/ms181091.aspx

    【讨论】:

    • 问题是我的数据库是mysql不是sqlserver?我还可以在哪里添加 try and catch 让我知道哪个特定插入有问题?
    • 为什么要为非 sql 服务器数据库使用 Sql 特定类?您需要为您的数据库服务器使用正确的 ADO.Net 库。
    • 是的,我正在使用 MySql.Data.MySqlClient;。当您说 sql 特定类时,我不明白吗?
    • 大声笑,我并没有从类的名称中得知您使用的是 MySql。我为此道歉。话虽如此,我相信也有可用于 MySql 的分析工具。这是一个(谷歌是你的朋友):profilesql.com
    • 好吧,基本上这个工具会做的是保存查询是吗?我的下一个挑战是基于我的代码,我可以进行一些额外的尝试和捕捉以突出显示哪个查询有问题吗?
    【解决方案2】:

    以下内容:

    String cmdText3 = "INSERT INTO record2(rID,supplierName,invoiceDate,invoiceNo) VALUES(@gafID,@supplierName,@invoiceDate,@invoiceNo,)";
    

    与您在此处指定的第一个参数不对应:

    cmd.Parameters.AddWithValue("@rID", rID);
    cmd.Parameters.AddWithValue("@supplierName", supplierName);
    cmd.Parameters.AddWithValue("@invoiceDate", invoiceDate);
    cmd.Parameters.AddWithValue("@invoiceNo", invoiceNo);
    

    替换:

    VALUES(@gafID,@supplierName,@invoiceDate,@invoiceNo,)
    

    与:

    VALUES(@rID,@supplierName,@invoiceDate,@invoiceNo)
    

    您也可以重命名:

    cmd.Parameters.AddWithValue("@rID", rID);
    

    收件人:

    cmd.Parameters.AddWithValue("@gafID", rID);
    

    【讨论】:

    • 对不起,我已经在我的问题中纠正了这一点。我错误地复制了。但回到我的实际问题,你建议指出哪个查询有问题或有问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 2014-06-11
    • 1970-01-01
    相关资源
    最近更新 更多