抛出C#异常:System.Data.dll中的'System.Data.SqlClient.SqlException'

时间:2017-06-23 18:47:04

标签: c# sql-server

如果我错过了某个地方的回答,请提前道歉,但我在任何地方都找不到它。所以我正在构建一个应用程序来扫描我们公司获得的PDF服务订单,解析它并将其插入到SQL DB中。问题出在本代码的末尾。它成功了:

  • 将原始pdf保存在正确的文件夹中
  • 扫描pdf并解析它
  • 将正确的数据插入服务订单表
  • 抓取刚创建的服务订单的PK,因为我们需要下一批插入

这里挂起了一个抛出异常的地方:System.Data.dll中的'System.Data.SqlClient.SqlException'

我预先通过所有工具,因为每个服务订单有多个,但在某个地方出现错误。要清楚我在insert语句上设置了一个断点,并且所有数据都是正确的并且格式正确(“string”int)

我觉得我的联系可能就好了吗?

无论如何,提前感谢您的帮助。

?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:news="http://www.google.com/schemas/sitemap-news/0.9">
  <url>
    <loc>http://www.example.org/business/article55.html</loc>
    <news:news>
      <news:publication>
        <news:name>The Example Times</news:name>
        <news:language>en</news:language>
      </news:publication>
      <news:genres>PressRelease, Blog</news:genres>
      <news:publication_date>2008-12-23</news:publication_date>
      <news:title>Companies A, B in Merger Talks</news:title>
      <news:keywords>business, merger, acquisition, A, B</news:keywords>
      <news:stock_tickers>NASDAQ:A, NASDAQ:B</news:stock_tickers>
    </news:news>
  </url>
</urlset>

2 个答案:

答案 0 :(得分:2)

  1. 编写插入语句时,应始终指定列名。这将保护代码免受表模式中列的顺序的更改。
  2. 您没有在sql语句中使用参数,使您的代码容易受到Sql Injection 的攻击。<​​/ li>
  3. 您应该在SqlConnection实例周围使用using语句,以确保即使发生异常也会关闭它们。
  4. 您的逻辑非常难以理解,将您的代码拆分为具有有意义名称的方法,而不是使用1&#34; God&#34;做一切的方法。
  5. 如果您遵循这些指导原则,问题最有可能在您的重构中解决。

    更新代码片段

    请注意,您应始终为列指定正确的类型和长度(如果适用)。也传递实际值,而不是字符串值。

    const String strQuery3 = "INSERT INTO TServiceInstruments (sim, sid, sis, sih, sip, lid) VALUES (@sim, @sid, @sis, @sih, @sip, @lid)";
    
    using(var conection = new SqlConnection(strConnString))
    using(SqlCommand command = new SqlCommand(strQuery3, connection))
    {
        command.Parameters.Add(new SqlParameter("@sim", SqlDbType.VarChar, 200){Value = sim});
        command.Parameters.Add(new SqlParameter("@sid", SqlDbType.VarChar, 200){Value = sid});
        command.Parameters.Add(new SqlParameter("@sis", SqlDbType.VarChar, 200){Value = sis});
        command.Parameters.Add(new SqlParameter("@sih", SqlDbType.VarChar, 200){Value = sih});
        command.Parameters.Add(new SqlParameter("@sip", SqlDbType.Int){Value = sip});
        command.Parameters.Add(new SqlParameter("@lid", SqlDbType.Int){Value = lid});
        connection.Open();
        command.ExecuteNonQuery();          
    }
    

    最后注意事项:您确实需要学习如何读取异常,这包括堆栈跟踪,它直接指向出现异常的调用堆栈中的行。如果你能理解这一点,那么调试就变得容易了。

答案 1 :(得分:0)

也许这不值得回答,但我正在努力建立一些声誉,所以这里有:)。

我怀疑你的错误在于“插入TServiceInstruments ...”语句。也就是说,您将为表提供更多(或更少)列。作为一种好的做法,请始终指定列,如下所示:

TextModel model = static_cast<TextModel> (ParserInstance.parse("some text here"));