3

每当我执行我的 C# 代码时,一切都很顺利,没有编译器错误,什么都没有。但是当我在服务器资源管理器中查看我的表时,没有插入任何内容。重新启动Visual Studio,仍然没有。

我去调试了,我在cmd执行之前查看了字符串,ExecuteNonQuery()字符串仍然是@itmId,...等等。不确定这是否会影响它。有什么帮助吗?

try
{
    Item workingItem = mItemList.Items[itemCombo.SelectedIndex - 1] as Item;
    SqlCeConnection sc = new SqlCeConnection(SalesTracker.Properties.Settings.Default.salesTrackerConnectionString);
    SqlCeCommand cmd = new SqlCeCommand("INSERT INTO Sales VALUES(@itmId, @itmNm,@fstNm, @date,@prft, @commision)", sc);
    cmd.Parameters.AddWithValue("@itmId", workingItem.ItemId);
    cmd.Parameters.AddWithValue("@itmNm", workingItem.ItemName);
    cmd.Parameters.AddWithValue("@fstNm", logedSalesmen.ID);
    cmd.Parameters.AddWithValue("@date", DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
    cmd.Parameters.AddWithValue("@prft", workingItem.Profit);
    cmd.Parameters.AddWithValue("@commision", workingItem.Commision);
    sc.Open();
    cmd.ExecuteNonQuery();
    sc.Close();
    MessageBox.Show("Save successfull");
    this.Close();
} 
catch (Exception exc)
{
    MessageBox.Show(exc.Message);
}

编辑:所以这是使用临时调试数据库的问题,我使用 select count(0) 来解决这个问题。但我不确定我应该在连接字符串中使用什么来修复它。

4

3 回答 3

3

这里最常见的错误实际上是部署问题 - 即有 2 个不同的数据库文件在运行。特别是,通常您正在调试(等)的数据库文件通常是“bin/debug”或类似文件中的文件,并且每次构建时都会被覆盖。但是人们经常查看更改的文件是他们项目树中的文件。

确保您正在查看正确的文件。

代码看起来不错;参数仍然是参数的事实完全可以预料并且是正确的。如果您想要一种简单的方法来验证插入,那么只需检查

SELECT COUNT(1) FROM Sales 

插入之前和之后;我预计它会增加。

还要检查您是否正在关闭并干净地处理连接(如果这只是一个在进程终止之前没有写入的缓冲更改)。两者sccmdare IDisposable,所以你应该using真正使用:

using(SqlCeConnection sc = new SqlCeConnection(
    SalesTracker.Properties.Settings.Default.salesTrackerConnectionString))
using(SqlCeCommand cmd = new SqlCeCommand(
    "INSERT INTO Sales VALUES(@itmId, @itmNm,@fstNm, @date,@prft, @commision)",
    sc))
{
    cmd.Parameters.AddWithValue("@itmId", workingItem.ItemId);
    cmd.Parameters.AddWithValue("@itmNm", workingItem.ItemName);
    cmd.Parameters.AddWithValue("@fstNm", logedSalesmen.ID);
    cmd.Parameters.AddWithValue("@date",
        DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
    cmd.Parameters.AddWithValue("@prft", workingItem.Profit);
    cmd.Parameters.AddWithValue("@commision", workingItem.Commision);
    sc.Open();
    cmd.ExecuteNonQuery();
}
于 2012-10-22T08:20:01.593 回答
2

您不应该转换DateTime.Now为字符串 - 传递它就像DateTime.Now

您应该在插入语句中指定列:即:

INSERT INTO Sales (ItemID,ItemName...) VALUES (@itmID)

您可以使用 SQL Profiler 检查正在传递给数据库的内容。

于 2012-10-22T08:07:58.130 回答
0

Visual Studio 有时可以在您不希望复制 SQLCE 数据库时,在您构建 C# 项目时。因此,在解决方案资源管理器中单击 sdf 文件,然后选择 Copy if newer。

于 2012-10-22T08:31:02.313 回答