0

データベース(.mdf)に関連するプロジェクトに取り組んでいます。C# を使用してビジュアル スタジオでいくつかの Windows フォームを作成しました。基本的に、これらのフォームは連携して、作成したサービスベースのデータベースからデータを保存、更新、および削除します。問題は、プロジェクトをビルドするときです。正常にビルドされ、エラーはありません。テキストボックスから提供されたデータを意図したとおりにデータグリッドビューにも挿入します。しかし、現在のデバッグを停止してから再実行するとすぐに、以前に提供されたすべてのデータが datagridview から失われます!! なぜこれが起こっているのか理解できません。誰でも私を助けてください。私はこのことにまったく慣れていません..少しのガイダンスをいただければ幸いです。

以前に MySQL を同じ目的で使用していた場合、更新されたデータはデータベースに永続的に保存されていましたが、MySQL から SQL Server のサービス ベースのデータベースに移行したため、このような紛らわしいエラーが発生しました。

    ......
    void loadData()
    {
        SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["baikalpik_bidhut_sewaConnectionString"].ToString());
        SqlCommand cmd = new SqlCommand("SELECT SNo,Customer_ID, Citizenship_No, Name, Subscription_Date, Phone_No, Location,Locality,Bulbs,Deposit,Monthly_Charge FROM customerinformation;", con);
        try
        {
            SqlDataAdapter adp = new SqlDataAdapter();
            adp.SelectCommand = cmd;
            DataTable dt = new DataTable();
            adp.Fill(dt);
            dataGridViewCustomerInformation.DataSource = dt;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    private void buttonAdd_Click(object sender, EventArgs e)
    {
        try
        {
            float m_chrg = Convert.ToInt64(textBoxBulbs.Text)*500;
            SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["baikalpik_bidhut_sewaConnectionString"].ToString());
            SqlCommand cmd = new SqlCommand("INSERT INTO customerinformation(SNo,Customer_ID,Citizenship_No,Name,Subscription_Date,Location,Locality,Bulbs,Deposit,Phone_No,Monthly_Charge) values('" + textBoxSNo.Text + "','" + textBoxCustomerID.Text + "','" + textBoxCitizenshipNumber.Text + "','" + textBoxName.Text + "','" + textBoxSubscriptionDate.Text + "','" + textBoxLocation.Text + "','" + textBoxLocality.Text + "','" + textBoxBulbs.Text + "','" + textBoxDeposit.Text + "','" + textBoxPhoneNumber.Text + "','" + m_chrg + "')", con);

            con.Open();
            SqlDataReader reader = cmd.ExecuteReader();
            dt = new DataTable();
            dt.Load(reader);
            con.Close();
            dataGridViewCustomerInformation.DataSource = dt;

            loadData();
            MessageBox.Show("Entry Added!");
            fillListbox();

            textBoxSNo.Clear();
            textBoxBulbs.Clear();
            textBoxCitizenshipNumber.Clear();
            textBoxCustomerID.Clear();
            textBoxDeposit.Clear();
            textBoxLocality.Clear();
            textBoxLocation.Clear();
            textBoxPhoneNumber.Clear();
            textBoxName.Clear();
            textBoxSubscriptionDate.Clear();



        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
4

1 に答える 1

0

プロジェクト ファイルに MDF がリストされている場合、プロパティCopy To Output Directoryは MDF ファイルを出力ディレクトリ (BIN\DEBUG または BIN\RELEASE) にコピーする方法を処理します。

このプロパティが に設定されている場合Copy Always、プログラムを実行すると、データベース ファイルの新しいコピーがプロジェクト フォルダーから出力にコピーされ、プログラムの前回の実行で挿入、変更、削除したすべてのデータが効果的に破棄されます。

このジレンマに対する最善の解決策は、MDF ファイルを永続的なデータベースとして Sql Server の現在のインストール内に追加し、接続文字列を調整することです。そしてもちろん、プロパティをに設定しますCopy Never

に設定することもできますCopy if newer。これにより、サーバー エクスプローラー内のデータベース スキーマを変更できるようになり、変更を加えた後にのみ Visual Studio IDE が新しい構造をコピーできるようになります。

UPDATE BUT IMPORTANT実際の質問とは関係ありませんが、挿入クエリは深刻な問題です。文字列連結を使用して SQL コマンド テキストを作成しないでください。特に部分的なテキストがユーザー入力からのものである場合。構文エラー (誰かがテキスト ボックス内に一重引用符を配置した場合) または最悪の場合、SQL インジェクションの問題に直面する可能性があります (面白い説明については、こちらを参照してください)
。挿入検索の良い例を見つけるには'parametrized query'

于 2013-05-04T17:34:18.510 に答える