我已经有了这段代码,可以在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));
......我看到了这个:
我不知道这是否意味着SiteMappings中没有任何内容,或者我试图以错误的方式查看内容。我首先添加了一个&#34; .ToString()&#34;但是它变灰了,所以认为这没有实际意义,而且会变得无声。
显然,根本问题是没有SiteMappings传递给该方法。我补充说:
foreach (SiteMapping sm in siteMaps)
{
MessageBox.Show(String.Format("this siteMap is {0}", sm));
...并且永远不会看到&#34;此站点地图是[bla]&#34;。
为了将来参考,上面的尖叫显示了&#34;空&#34;中包含的内容。 IEnumerable的。
事实证明这是一个数据问题(GIGO)。或者,试图进入的垃圾不会进入。
答案 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,我无法为您测试。
如果有效,您只需要创建一个命令,只打开一个数据库连接。