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);
}

EDIT:それは使用されている一時的なデバッグデータベースの問題です。それを理解するためにselect count(0)を使用しました。しかし、それを修正するために接続文字列で何を使用すればよいかわかりません。

4

3 に答える 3

3

ここで最も一般的なエラーは、実際には展開の問題です。つまり、2 つの異なるデータベース ファイルが動作しているということです。特に、通常、デバッグ対象のデータベース ファイル (など) は、多くの場合、"bin/debug" などにあるファイルであり、ビルドするたびに上書きされます。しかし、人々が変更を確認するためによく見るファイルは、プロジェクト ツリー内のファイルです。

正しいファイルを見ていることを確認してください。

コードは問題ないようです。パラメータがまだパラメータであるという事実は、完全に予期されたものであり、正しいものです。挿入を検証する簡単な方法が必要な場合は、チェックしてください

SELECT COUNT(1) FROM Sales 

挿入の前後。増えていくと思います。

また、接続を正常に閉じて破棄していることも確認してください (これが、プロセスが終了する前に書き込まれなかった単なるバッファリングされた変更である場合)。sccmdはどちらもであるため、実際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 プロファイラーを使用して、データベースに何が渡されているかを確認できます。

于 2012-10-22T08:07:58.130 に答える
0

Visual Studioは、C#プロジェクトをビルドするときに、SQLCEデータベースをコピーしたくないときにコピーできる場合があります。そのため、ソリューションエクスプローラーでsdfファイルをクリックし、[新しい場合はコピー]を選択します。

于 2012-10-22T08:31:02.313 に答える