使用C#插入DB2 / 400数据库时丢失了一些记录

时间:2017-09-06 09:46:45

标签: c# db2 odbc ibm-midrange db2-400

我们使用C#开发了网站并托管在IIS上,后者将记录插入到IBM DB2 / 400数据库中。使用' iSeries Access ODBC驱动程序'进行连接。

记录以循环方式插入,有时在DB2 / 400文件中缺少某些记录。没有错误被解雇。

Ex:记录数量5

1 - 已插入

2 - 已插入

3 - 缺少

4 - 已插入

5 - 已插入

有人可以告诉我这可能是什么原因以及如何克服这个问题?

谢谢!

编辑:

    try
    {
        // Select Statement here
        // Some other Insert statements here


        foreach (var item in Items)
        {
        sql.Clear();
        sql.Append("INSERT INTO LIBRARY.TABLE ");
        sql.Append("(Fld1, Fld2, Fld3, Fld4) ");
        sql.Append("VALUES ");
        sql.Append("('XX','" + YYYYY + "'," + ZZZZZ + ", '5' ");
        sql.Append(") ");

        DataBase.Execute(sql.ToString(), conn);
        }

// Some other Inserts here

    catch (Exception ex)
         {
        log.Write(ex.Message);
    }

//In DataBase Class



   public static void Execute(string sqlQuery, OdbcConnection conn)
    {

        OdbcCommand odbcCommand = new OdbcCommand
        {
            Connection = conn,
            CommandText = sqlQuery,
            CommandType = CommandType.Text
        };

        odbcCommand.ExecuteNonQuery();
    }

3 个答案:

答案 0 :(得分:0)

您是否已解析输入字段并确保所有特殊字符都已转义?数字和日期是否在正确的文化设置中?

您是否检查过所有值是否在其限制范围内。包括sql命令字符串的总大小?

您是否检查过您是否计算了rigth单位的字段大小?如果DB字段限制是在8位字符集中设置的,那么一个常见的错误是计算UTF-8字符而不是字节表示。

答案 1 :(得分:0)

如果可以避免,请不要将变量值连接到SQL字符串中。而是使用像这样的参数标记:

foreach (var item in Items) {
  sql.Clear();
  sql.Append("INSERT INTO LIBRARY.TABLE ");
  sql.Append("(Fld1, Fld2, Fld3, Fld4) ");
  sql.Append("VALUES ");
  sql.Append("('XX', ?, ?, '5')");

  DataBase.setParm(XXXX);
  DataBase.setParm(YYYY);
  DataBase.Execute(sql.ToString(), conn);
}

您可能需要重新编写数据库类来设置参数,但是使用变量参数而不是仅将它们连接起来将删除包含逗号和引号等内容的数据所带来的问题。

答案 2 :(得分:0)

1. Look your log, no doubt you have information into
2. Try to verify if your conn is open into your 'Execute' method (may be connexion can be not open, timeout etc...), something like this :

if (conn.State != conn.Open)
{
    conn.Close();
    conn.Open();
}

3. Control YYYYY max lenght, YYYYY must not contains quote (otherwise you must replace quote by double-quote) and for ZZZZZ variable control it's never empty (i suppose this column is a numeric or a Date or a timestamp because you dont use quote into you concatenation)

4. Dont forget to close you connexion after your job
5. For security you should be use Parameterized query like [here][1] 
6. If you can, you should use 'IBM i Access for Windows' driver for you connexion (search IBM.Data.DB2.iSeries.dll) its better for performance

祝你有个美好的一天!