0

私はここで愚かであると確信していますが、まあ。

私のコードは次のとおりです。

private void btnInsert_Click(object sender, EventArgs e)
{
        SqlConnection conn = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\LiftLog.mdf;Integrated Security=True;User Instance=True");
        conn.Open();

        SqlCommand cmdInsert = conn.CreateCommand();
        cmdInsert.CommandText = "INSERT INTO tblLog (Date, Time, Floor) VALUES (1011, 0011, 3)";
        cmdInsert.ExecuteNonQuery();
}

null以外のフィールドにデータを入力しないと文句を言うので、テーブルに接続しています。ただし、ボタンをクリックしても、テーブルは更新されません。

なんで?

これはデータを取得するために機能しました:

    System.Data.SqlClient.SqlConnection con;
    System.Data.SqlClient.SqlDataAdapter da;
    DataSet ds1;

    // Connects to database.
    private void Form1_Load(object sender, EventArgs e)
    {
        con = new System.Data.SqlClient.SqlConnection();
        ds1 = new DataSet();
        con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\LiftLog.mdf;Integrated Security=True;User Instance=True";
        con.Open();
        string sql = "SELECT * From tblLog";
        da = new System.Data.SqlClient.SqlDataAdapter(sql, con);
        da.Fill(ds1, "LogOutput");
        NavigateRecords();
        con.Close(); 
     }

SSMSは私にはうまくいかないので、これを何らかの方法で変更して挿入することはできますか?

また、入力のサニタイズなどについても知っています。問題を特定するために、すべて削除しました。

4

1 に答える 1

1

このUser Instance と AttachDbFileName=のアプローチ全体には欠陥があります - せいぜい! Visual Studio は.mdfファイルを (Visual Studio 内でアプリが実行されるプロジェクトの出力ディレクトリに) コピーします。ほとんどの場合、問題なく動作しますが、最終的に間違った .mdf ファイルINSERTを見ているだけです!

このアプローチに固執したい場合は、myConnection.Close()呼び出しにブレークポイントを設定してから.mdf、SQL Server Mgmt Studio Express を使用して (プロジェクトの出力ディレクトリにある) ファイルを調べてください。データがそこにあることはほぼ確実です。

私の意見では、本当の解決策は

  1. SQL Server Express をインストールします (とにかく、既に完了しています)。

  2. SQL Server Management Studio Express をインストールする

  3. SSMS Expressでデータベースを作成し、論理名を付けます (例: LiftLog)

  4. 論理データベース名(サーバー上で作成したときに指定) を使用して接続し、物理データベース ファイルとユーザー インスタンスをいじらないでください。その場合、接続文字列は次のようになります。

    Data Source=.\\SQLEXPRESS;Database=LiftLog;Integrated Security=True
    

    そして、それ以外はすべて以前とまったく同じです...

また、注意してください: a) SQL インジェクション攻撃を回避し、b) SQL Server のパフォーマンスを大幅に向上させるために、常にパラメーター化されたクエリを使用することを強くお勧めします。

したがって、代わりに:

cmdInsert.CommandText = "INSERT INTO tblLog (Date, Time, Floor) 
                         VALUES (1011, 0011, 3)";

あなたが使用する必要があります

cmdInsert.CommandText = "INSERT INTO tblLog (Date, Time, Floor) 
                         VALUES (@Date, @Time, @Floor)";

次に、オブジェクトでこれらのパラメーター ( @Date, @Time, @Floor) を定義SqlCommandし、そのように値を入力します。

于 2012-12-01T16:32:02.650 に答える