1

この 1 週間ほどの間、私は Sql-Server 2008 データベースに接続する ASP サイトを構築してきました。私はストアド プロシージャを使用したことがないので、ASP メソッド内でストアド プロシージャを作成する方法と使用する方法について、誰かが私にガイダンスを提供してくれるかどうか疑問に思っていました。ウェブサイトのコードをできるだけシンプルかつエレガントにしようとしています。ストアド プロシージャに変更しようとしているコードは次のとおりです。

    private void ExecuteInsert(string name, string type)
{
    SqlConnection conn = new SqlConnection(GetConnectionStringHM());
    string sql = "INSERT INTO tblSoftwareTitles (SoftwareName, SoftwareType) VALUES " 
        +"(@SoftwareName,@SoftwareSystemType)";

    try
    {
        conn.Open();
        SqlCommand cmd = new SqlCommand(sql, conn);
        SqlParameter[] param = new SqlParameter[2];
        //param[0] = new SqlParameter("@SoftwareID);
        param[0] = new SqlParameter("@SoftwareName", SqlDbType.NVarChar, 200);
        param[1] = new SqlParameter("@SoftwareType", SqlDbType.Int);

        param[0].Value = name;
        param[1].Value = type;

        for (int i= 0; i < param.Length; i++)
        {
            cmd.Parameters.Add(param[i]);
        }
        cmd.CommandType = CommandType.Text;
        cmd.ExecuteNonQuery();
    }
    catch (System.Data.SqlClient.SqlException ex)
    {
        string msg ="Insert Error:";
        msg += ex.Message;
        throw new Exception(msg);
    }

    finally
    {
        conn.Close();
    }

    }

これは、エントリ フォームから 2 つのパラメータを取得してデータベースに挿入する単純な挿入です。後で知っておくと便利なことだと思うので、これに関するヘルプは大歓迎です。前もって感謝します!

4

4 に答える 4

4

MSDN の基本を調べる必要があります: http://msdn.microsoft.com/en-us/library/bb896274.aspx

for ループを使用して物事を複雑にする必要はありません。

try
  {
     sqlConnection = new SqlConnection(dbConnectionString);
     SqlCommand command = new SqlCommand(sql, sqlConnection);
     command.CommandType = CommandType.StoredProcedure;
     command.Parameters.Add("@SoftwareName", SqlDbType.NVarChar, 200).Value = SoftwareNameHere;
     command.Parameters.Add("@SoftwareType",  SqlDbType.Int).Value = SoftwareTypeHere;
     sqlConnection.Open();
     return command.ExecuteNonQuery();
  }
catch (SqlException ex)
  {
     Console.WriteLine("SQL Error" + ex.Message.ToString());
     return 0;
  }
finally
  {
     conn.Close(); 
  }

.NET 3.5 以降を使用している場合USINGは、リソースの破棄を処理するコード ブロックを使用できます。完全にはわかりませんが、私が覚えている限り、これはコード ブロックを置き換えるために.NET 3.5Try/Finallyで導入されました (開発者は接続オブジェクトなどのリソースをコードを介して手動で破棄する必要がありました)。

using (SqlConnection con = new SqlConnection { dbConnectionString })
{
    con.Open();
    try
    {   
        using (SqlCommand command = new SqlCommand { CommandType = CommandType.StoredProcedure, Connection = con, CommandTimeout = 300, CommandText = "sp_Test" })      
        {
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.Add("@SoftwareName", SqlDbType.NVarChar, 200).Value = SoftwareNameHere;
            command.Parameters.Add("@SoftwareType",  SqlDbType.Int).Value = SoftwareTypeHere;

            command.ExecuteNonQuery();
        }
    }
    catch(SqlException ex)
    {
        //ex.ToString message here;
    }
}
于 2013-07-24T14:38:50.350 に答える
1

あなたが探している答えは、このSOの投稿にあります...

https://stackoverflow.com/a/4561443/1246574

その投稿で受け入れられた回答について私が改善したいことの1つは、その回答の例が USING ステートメントを使用していないことです。USING ステートメント内に接続とコマンドを配置して、それらが自動的に破棄されるようにすることをお勧めします。

もう 1 つの方法は、Microsoft Enterprise Library を使用して SQL Server DB と対話することです。普通の古い SqlConnection と SqlCommand を使用するよりも簡単だと思います。

于 2013-07-24T14:37:58.070 に答える
1

あなたのコードはすでにパラメーターを使用しているので、90% の方法で完了です。あなたがしなければならないことは次のとおりです。

  1. 挿入ステートメントをストアド プロシージャに入れ、動的ステートメントと同じパラメーター定義を維持します。
  2. CommandType.Textに変更CommandType.StoredProcedure
  3. コマンド テキストをストアド プロシージャの名前だけに変更します。
于 2013-07-24T14:40:37.493 に答える