0

これは以下の私のコードです。プログラムは正常に実行されます。例外はありません。しかし、結局、テーブルには新しく挿入された行が含まれていません。(接続文字列が正しいことに注意してください)。

string Name = "myname";
string Age = "myage";

string sql = "INSERT INTO Student (Name, Age) VALUES ('" + Name + "','" + Age + "')";

SqlConnection conn = new SqlConnection(ConfigHelper.GetConnectionString());
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
conn.Close();
4

2 に答える 2

4

あなたが尋ねている問題を引き起こす主な問題は、接続が決して開かれないことです。

接続が開かれるまで、コマンドを実行することはできません


他にもいくつか問題があります。

  • エラーの特定に役立つエラー処理は見当たりません。エラーが表示されないように、エラーを飲み込んでいる可能性があります。
  • 文字列を連結しているため、SQLインジェクションを利用できます。パラメータ化されたクエリについて学ぶことを強くお勧めします。
  • 接続にusingステートメントを使用していないため、自動的に閉じて破棄されます

いくつかのベストプラクティスがここにリストされています。これは、「using」ステートメントを適切に使用するための抜粋です。

C#で「Using」ステートメントを使用する

C#プログラマーにとって、ConnectionオブジェクトとDataReaderオブジェクトを常に閉じるようにする便利な方法は、usingステートメントを使用することです。usingステートメントは、usingステートメントのスコープを離れるときに、「使用中」のオブジェクトに対してDisposeを自動的に呼び出します。例えば:

//C#
string connString = "Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;";
using (SqlConnection conn = new SqlConnection(connString))
{
  SqlCommand cmd = conn.CreateCommand();
  cmd.CommandText = "SELECT CustomerId, CompanyName FROM Customers";

  conn.Open();

  using (SqlDataReader dr = cmd.ExecuteReader())
  {
    while (dr.Read())
      Console.WriteLine("{0}\t{1}", dr.GetString(0), dr.GetString(1));
  }
}
于 2012-06-27T14:55:46.930 に答える
1

まず第一に:パラメーター化されたクエリの使用を開始します!それ以外の場合、コードは常にSQLインジェクション攻撃に対してオープンです-対処する必要のあるものではありません。

この機能を使用していると仮定すると(元の質問で示していない接続文字列によって異なります)、ユーザーインスタンスとAttachDbFileName =のアプローチ全体に欠陥があります-せいぜい!Visual Studioは.mdfファイルをコピーし、ほとんどの場合、正常に動作しますが、最終的には間違った.mdfファイルINSERTを見ているだけです。

このアプローチを使い続けたい場合は、myConnection.Close()呼び出しにブレークポイントを設定してみてください。次に.mdf、SQL Server MgmtStudioExpressを使用してファイルを調べてください。データがそこにあることはほぼ間違いありません。

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

  1. SQL Server Expressをインストールします(とにかくすでにそれを実行しています)

  2. SQL Server ManagementStudioExpressをインストールします

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

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

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

    そして他のすべては以前とまったく同じです...

于 2012-06-27T15:13:06.317 に答える