为什么这个SQLite插入失败?

时间:2015-01-16 19:01:36

标签: c# sqlite compact-framework windows-ce executenonquery

我已经有了这段代码,可以在Windows CE / Compact Framework应用程序的SQLite数据库中插入1..N记录:

void IPlatypusDBUtils.SaveSiteMappingData(IEnumerable<SiteMapping> siteMappings)
{
    ExceptionLoggingService.Instance.WriteLog("Reached TestPlatypusDBUtils.SaveSiteMappingData");
    IEnumerable<SiteMapping> siteMaps = siteMappings;
    try
    {
        using (SQLiteConnection conn = new SQLiteConnection(PlatypusUtils.GetDBConnection()))
        {
            conn.Open();
            foreach (SiteMapping sm in siteMaps)
            {
                using (SQLiteCommand cmd = new SQLiteCommand(conn))
                {   
                    cmd.CommandText =
                            @"INSERT INTO SiteMapping (Id, SiteNumber, LocationNumber, SiteName) VALUES (@Id, @SiteNumber, @LocationNumber, @SiteName)";
                    cmd.Parameters.Add(new SQLiteParameter("LocationNumber", sm.Id));
                    cmd.Parameters.Add(new SQLiteParameter("SiteNumber", sm.SiteNumber.ToString())); // or Platypusconsts.currentsitenum ?
                    cmd.Parameters.Add(new SQLiteParameter("LocationNumber", sm.LocationNumber));
                    cmd.Parameters.Add(new SQLiteParameter("SiteName", sm.SiteName));
                    cmd.ExecuteNonQuery();
                } // using (SQLiteCommand cmd
            } // foreach (SiteMapping sm in siteMaps)
            conn.Close();
        } // using (SQLiteConnection conn
    } // try
    catch (Exception ex)
    {
        String msgInnerExAndStackTrace = String.Format(
            "{0}; Inner Ex: {1}; Stack Trace: {2}", ex.Message, ex.InnerException, ex.StackTrace);               ExceptionLoggingService.Instance.WriteLog(String.Format("Exception in TestPlatypusDBUtils.SaveSiteMappingData: {0}", msgInnerExAndStackTrace));
    } // catch
}

...但无法插入任何记录。日志文件包含&#34; Reached TestPlatypusDBUtils.SaveSiteMappingData&#34; (达到了Insert方法)但不是#34; TestPlatypusDBUtils.SaveSiteMappingData&#34;中的异常。 ExecuteNonQuery()不是对插入的正确调用,或者是什么问题?

更新

我在第一次日志写入下面添加了这个:

MessageBox.Show(String.Format("siteMappings about to be inserted into SiteMapping table: {0}", siteMappings));

......我看到了这个:

enter image description here

我不知道这是否意味着SiteMappings中没有任何内容,或者我试图以错误的方式查看内容。我首先添加了一个&#34; .ToString()&#34;但是它变灰了,所以认为这没有实际意义,而且会变得无声。

更新2

显然,根本问题是没有SiteMappings传递给该方法。我补充说:

foreach (SiteMapping sm in siteMaps)
{
    MessageBox.Show(String.Format("this siteMap is {0}", sm));

...并且永远不会看到&#34;此站点地图是[bla]&#34;。

为了将来参考,上面的尖叫显示了&#34;空&#34;中包含的内容。 IEnumerable的。

更新3

事实证明这是一个数据问题(GIGO)。或者,试图进入的垃圾不会进入。

2 个答案:

答案 0 :(得分:3)

你有LocationNumber两次提及。

     ....
      //SHOULD BE [ID], PROBABBLY
      cmd.Parameters.Add(new SQLiteParameter("LocationNumber", sm.Id)); 


      cmd.Parameters.Add(new SQLiteParameter("SiteNumber", sm.SiteNumber.ToString()));                       
cmd.Parameters.Add(new SQLiteParameter("LocationNumber", sm.LocationNumber));
      cmd.Parameters.Add(new SQLiteParameter("SiteName", sm.SiteName));
       ....

答案 1 :(得分:1)

在你决定网站映射是一种他们可以在Windows CE上存储信息而不需要创建新文件的方式之前,我猜是有人。

为什么IEnumerable?如何传递List呢?

那么,在您的服务器上,这些字段是什么样的?

我在5年多的时间里没有使用SQLite,即便如此,我也没有长时间使用它。

如果SQLite支持命名参数,您可以执行类似这样的操作(基于Microsoft T-SQL):

private void IPlatypusDBUtils.SaveSiteMappingData(List<TSql> siteMappings) {
    var isnull = (siteMapping == null) ? "True" : "False";
    var count = (siteMapping == null) ? "-1" : siteMapping.Count.ToString();
    ExceptionLoggingService.Instance.WriteLog(
      String.Format("siteMapping is null? {0} siteMapping Count: {1}",
      isnull, count));
    string sqlCmd =
        @"INSERT INTO SiteMapping " +
        "(Id, SiteNumber, LocationNumber, SiteName) " +
        "VALUES " +
        "(@Id, @SiteNumber, @LocationNumber, @SiteName)";
    using (var cmd = new SQLiteCommand(sqlCmd, new SQLiteConnection(PlatypusUtils.GetDBConnection()))) {
        // Setup your parameters here,
        // using the data types found in your database,
        // before ever opening the database connection.
        cmd.Parameters.Add("@Id", DbType.Int);
        cmd.Parameters.Add("@SiteNumber", DbType.VarChar, 50); // or Platypusconsts.currentsitenum ?
        cmd.Parameters.Add("@LocationNumber", DbType.Int);
        cmd.Parameters.Add("@SiteName", DbType.VarChar, 50);
        try { // now open your connection
            cmd.Connection.Open();
            foreach (var sm in siteMappings) {
                cmd.Parameters["@Id"].Value = sm.Id;
                cmd.Parameters["@SiteNumber"].Value = sm.SiteNumber.ToString();
                cmd.Parameters["@LocationNumber"].Value = sm.LocationNumber;
                cmd.Parameters["@SiteName"].Value = sm.SiteName;
                cmd.ExecuteNonQuery();
            }
        } catch (SQLiteException ex) {
            // Focus your Exception on the SQLiteException
            String msgInnerExAndStackTrace = String.Format(
                    "{0}; Inner Ex: {1}; Stack Trace: {2}", ex.Message, ex.InnerException, ex.StackTrace);
            ExceptionLoggingService.Instance.WriteLog(String.Format("Exception in TestPlatypusDBUtils.SaveSiteMappingData: {0}", msgInnerExAndStackTrace));
        } finally {
            // Placing your Close command here will work even if
            // the code throws an exception.
            cmd.Connection.Close();
        }
    }
}

由于我没有在任何地方安装SQLite,我无法为您测试。

如果有效,您只需要创建一个命令,只打开一个数据库连接。