3

MDFファイルベースのデータベースがアタッチされたWinFormsベースのC#ツールを使用しています。この方法を使用して、この接続されたMDFデータベースにレコードを保存しようとしていSqlCommand.ExecuteNonQuery()ますが、レコードが保存されません。エラーや例外は発生しません。唯一の問題は、レコードが実際に保存されないことです。

Console.WriteLine実行しようとしているクエリを示すが上部にあります。構文的には正しいので、出力ウィンドウからコピーして貼り付けて個別に実行すると、機能します。

接続文字列を次のように正しく定義しました。レコードのフェッチには正常に機能します。

public static String connectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\TestBuildDB.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";

レコードを保存するために使用している関数は次のとおりです。

public static void PerformDBWriteTransaction(string inputSQLStatement)
{
    Console.WriteLine(inputSQLStatement);
    DataTable returnDataTable = new DataTable();
    SqlConnection sqlConnection = new SqlConnection();
    sqlConnection.ConnectionString = connectionString;
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = sqlConnection;
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = inputSQLStatement;
    cmd.Connection.Open();
    try
    {
        cmd.ExecuteNonQuery();
    }
    catch (SqlException ex)
    {
        errorMessages.Clear();
        errorMessages.Append("The following errors were found in the SQL statement:\n\n");

        for (int i = 0; i < ex.Errors.Count; i++)
        {
            errorMessages.Append("Index #" + i + "\n" +
                "Message: " + ex.Errors[i].Message + "\n" +
                "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
                "Source: " + ex.Errors[i].Source + "\n" +
                "Procedure: " + ex.Errors[i].Procedure + "\n");
        }
        MessageBox.Show(errorMessages.ToString());
    }
    finally
    {
        cmd.Connection.Close();
    }
}

誰かが何が問題なのか教えてもらえますか?どういうわけか「コミット」を実行する必要がありますか?

編集:

私は問題を見つけ、以下に解決策を書きました..しかし私を助けてくれたすべての人に感謝します:)

4

6 に答える 6

8

問題を見つけました!それは非常に単純で、本当にばかげていました:) ..上記のコードはすべて正しいです..はい、人々は最適化などを指摘しましたが、それでも上記のコードは正しいです。

問題は、TestDB.MDFファイルをVisual 2010プロジェクトにインポートしたときに、そのコピーがプロジェクトのフォルダー内に作成されたことでした。プログラムを実行/デバッグすると、このファイルの別のコピーが作成され、\ bin \Debug\フォルダーに配置されます。私が使用していた接続文字列で、私は次のように述べました:AttachDbFilename=|DataDirectory|\TestBuildDB.mdf..これは、すべての読み取り/書き込みがbin\Debugフォルダー内のコピーに対して行われたことを意味します。ただし、レコードが挿入されているかどうかを確認するために調べていたTestDB.MDFファイルは、プロジェクトのフォルダーにありました。つまり、基本的に2つのMDFファイルがあり、レコードを1つのファイルに書き込んでいましたが、もう1つのファイルでそれらを見つけようとしていました:)

MDFファイルをVS2010プロジェクトに追加すると、VS2010はデフォルトでそのMDFファイルに接続し、そこからそのMDFファイル内のものを参照できます。この目的で使用されるMDFファイルは、プロジェクトのフォルダーに配置されたものでした。 、bin \Debug\フォルダにあるものではありません。そして、前に言ったように、私のコードはbin\Debugフォルダーにあるものを使用しました:)

つまり、私が今行ったことは、プロジェクトからTest.MDFファイル参照を削除したことです。これにより、プロジェクトのフォルダーにあるコピーが削除されます。ただし、アプリケーション内から接続するbin \Debug\フォルダーにTestDB.MDFファイルのコピーがあります。また、プロジェクトの外部でMDfファイルを参照する場合は、SQLManagementStudioを使用します。ここでの唯一の問題は、MDFファイルは一度に1つのプログラムでしか使用できないことです。したがって、アプリケーションで使用する必要がある場合は、SQL Management Studioからオフラインにする必要があり、その逆も同様です。

この説明が誰かに役立つことを願っています:)

于 2012-09-26T09:27:37.683 に答える
3

この問題の解決策は非常に簡単です。接続文字列に元のMDFファイルのフルパスを次のように指定するだけです。

connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=**C:\VISUAL STUDIO 2012\PROJECTS\ENGLISHTOHINDIDICTIONARY\ENGLISHTOHINDIDICTIONARY\DICTIONARY.MDF**;Initial Catalog=Dictionary;Integrated Security=false"
        providerName="System.Data.SqlClient"

それだけです、あなたの問題は解決されました。

于 2014-12-11T06:15:23.343 に答える
2

同じ課題がありました。データベースのプロパティ「出力ディレクトリにコピー」を「常にコピー」から「コピーしない」に変更してから、database.mdf(IDEからドラッグアンドドロップ)をbin\debugフォルダーに移動しました。

ヒント:binディレクトリは通常非表示になっています。「すべてのファイルを表示」を使用して表示します

于 2015-04-21T07:26:32.980 に答える
0

すべての例外にcatch句を指定します。SqlException以外に問題がある場合、それが何であるかはわかりません。データベースを更新する必要があります。FormatExceptionがあると想像してください...

また、ExecuteNonQueryの戻り値も確認してください。これは、クエリの影響を受ける行数です。

于 2012-09-24T12:18:26.673 に答える
0

まず、オブジェクトを常にaでラップして、IDisposableオブジェクトusingが閉じられ、適切に破棄されるようにする必要があります(そして、接続プールがその機能を実行できるようにします)。次に、データを変更するときは、SQLをトランザクションにまとめて、データの整合性を維持します。

次のコードを試して、例外が発生するかどうかを確認してください。あまりにも一般的であるため、通常はキャッチExceptionすることをお勧めしません。それを呼び出しメカニズムにバブルさせてそこで処理しますが、この場合は、すべての問題が表示されます。あなたの特定の問題は.Open接続の段階にあると思いますので、ステップスルーしてみてください。

public static void PerformDBWriteTransaction(string inputSQLStatement)
{
    DataTable returnDataTable = new DataTable();

    try
    {
        using (SqlConnection sqlConnection = new SqlConnection(connectionString))
        {
            sqlConnection.Open();

            using (SqlTransaction sqlTrans = sqlConnection.BeginTransaction())
            {
                try
                {
                    using (SqlCommand cmd = new SqlCommand(inputSQLStatement, sqlConnection))
                    {
                        cmd.CommandType = CommandType.Text;
                        cmd.Transaction = sqlTrans;
                        cmd.ExecuteNonQuery();
                    }
                }
                catch (SqlException sqlEx)
                {
                    sqlTrans.Rollback();

                    throw sqlEx;
                }

                sqlTrans.Commit();
            }
        }
    }
    catch (Exception ex)
    {
        errorMessages.Clear();
        errorMessages.Append("The following errors were found in the SQL statement:\n\n");

        for (int i = 0; i < ex.Errors.Count; i++)
        {
            errorMessages.Append("Index #" + i + "\n" +
            "Message: " + ex.Errors[i].Message + "\n" +
            "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
            "Source: " + ex.Errors[i].Source + "\n" +
            "Procedure: " + ex.Errors[i].Procedure + "\n");
        }

        MessageBox.Show(errorMessages.ToString());
    }
}
于 2012-09-24T12:27:08.307 に答える
-1

こんにちは私は学生レコードを追加するときにライブラリデータベースで作業していexecutionNonQuery ますが、無効な列名ページが開くなどのエラーが表示されますが、データの保存が発生しません。ここに私はコードステートメントを与えました

public partial class add_student_info : Form
{
    SqlConnection con = new SqlConnection(@"Data Source=DESKTOP-SPT6GLG\SQLEXPRESS;Initial Catalog=library_managment;Integrated Security=True;Pooling=False");

    public add_student_info()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {

            con.Open();
            SqlCommand cmd = con.CreateCommand();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "insert into student_info values('" + textBox1.Text + "','" + textBox2.Text + "','" + textBox3.Text + "','" + textBox4.Text + "'," + textBox5.Text + "," + textBox6.Text + "," + textBox7.Text + ")";
            cmd.ExecuteNonQuery();
            con.Close();

            MessageBox.Show("Student recorc addedd sussfully");

        }
    }
}
于 2018-03-18T07:36:14.073 に答える