0

私はいくつかの単純な C# を作成しており、通常は、データベースからデータを挿入して取得する同じクラスと関数を使用しています。

たとえば、これは私の機能です:

    public bool insert_and_ConfirmSQL(String Query, String comments)
    {
        bool success = false;
        NpgsqlCommand cmd = new NpgsqlCommand();
        NpgsqlConnection mycon = new NpgsqlConnection();
        string connstring = String.Format("Server={0};Port={1}; User Id={2};Password={3};Database={4};timeout=1000;CommandTimeout=120;", tbHost, tbPort, tbUser, tbPass, tbDataBaseName);
        mycon.ConnectionString = connstring;
        cmd = mycon.CreateCommand();
        cmd.CommandText = Query;
        mycon.Open();

        int temp = 0;
        try
        {
            temp = cmd.ExecuteNonQuery();
            success = true;
        }
        catch
        {
           if (mycon.State == ConnectionState.Open)
            {
                mycon.Close();
            }
        }

        return success;
    }

このクエリはインジェクションに対して安全ではないことがわかったので、準備済みステートメントを使用する必要があります。しかし、クエリがそれぞれ異なる場合、これにどのようにアプローチすればよいかわかりません。クエリを挿入して「準備」する「ユニバーサル」関数はありますか?

4

2 に答える 2

3

using ステートメントは接続とコマンドの破棄を処理するため、この方法で使用することをお勧めします。

また、sqlinjection に対して安全を確保するために、SqlParameters (Npgsl で同等) に値を渡します。

public void insert_and_ConfirmSQL(文字列クエリ、文字列コメント) {

     using(NpgsqlConnection mycon = new NpgsqlConnection())
      {
        using(NpgsqlCommand cmd = mycon.CreateCommand())
        {
              string connstring = String.Format("Server={0};Port={1}; User Id={2};Password={3};Database={4};timeout=1000;CommandTimeout=120;", tbHost, tbPort, tbUser, tbPass, tbDataBaseName);
              mycon.ConnectionString = connstring;
              cmd = mycon.CreateCommand();
             cmd.CommandText = Query;
              mycon.Open();

            cmd.ExecuteNonQuery();
       }
     }

}

于 2012-07-13T00:26:04.350 に答える
2

挿入/更新/削除を実行するより一般的な方法を探している場合は、おそらく次の方法が適しています (SqlClient を使用しますが、NpgsqlClient には簡単に適応できます)。

public static object ExecuteActionProcedure(System.Data.CommandType CommandType, string CommandText, string[] Parameters, object[] Values)
{
  try
  {
    using (SqlConnection con = new SqlConnection())
    {
      con.ConnectionString = ConfigurationManager.ConnectionStrings["YourConnection"].ConnectionString;
      con.Open();
      using (SqlCommand cmd = new SqlCommand())
      {

        cmd.Connection = con;
        cmd.CommandType = CommandType;
        cmd.CommandText = CommandText;
        SqlParameter result = new SqlParameter();
        result.ParameterName = "ResultValue";
        result.Direction = ParameterDirection.ReturnValue;
        cmd.Parameters.Add(result);
        for (int i = 0; i < Parameters.Length; i++)
        {
          cmd.Parameters.AddWithValue(Parameters[i], Values[i]);
        }
        cmd.ExecuteNonQuery();
        return (int)result.Value;
      }
    }
  }
    }
  }
  catch (Exception ex)
  {
    throw new Exception(ex.Message);
    return null;
  }
}

呼び出しステートメント:

ExecuteActionProcedure(CommandType.StoredProcedure, "aspnet_SaveFullName", new string[] { "UserName", "FullName" }, new object[] { model.UserName, model.FullName });

パラメータとストアド プロシージャを含む SQL 文字列をこのメソッドに渡すことができることに注意してください。

于 2012-07-13T00:54:47.617 に答える