1

私はC#プログラミングが初めてなので、誰かが私を助けてくれれば幸いです。同様の質問があることは知っていますが、まだ問題の解決策が見つかりません。ユーザーが製品を購入したときに、システムがすべてのトランザクションの詳細を保存するモックシステムを開発しています。問題は、データをデータベースに挿入できないことです。コードは次のとおりです。

using (SqlConnection conn = new SqlConnection
    (ConfigurationManager.ConnectionStrings["database"].ConnectionString))
{
    string QueryA = "@Insert into TransDetails(AccountNumber,Amount,Provider" 
        + ",Mobile Number,TransNum,TransDate, Status) "
        + " Values (@AccountNumber,@Amount,@Provider,@Mobile Number," 
        + "@TransNum,@TransDate,@Status";

    using (SqlCommand cmd = new SqlCommand("InsertRecord", conn))
    {
        conn.Open();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = QueryA;
        cmd.Parameters.AddWithValue("@AccountNumber", acc.Text);
        cmd.Parameters.AddWithValue("@Amount", lblAmount.Text);
        cmd.Parameters.AddWithValue("@Provider", lblProvider.Text);
        cmd.Parameters.AddWithValue("@Mobile Number", lblNumber.Text);
        cmd.Parameters.AddWithValue("@TransNum", lblTrans.Text);
        cmd.Parameters.AddWithValue("@TransDate", lblDate.Text);
        cmd.Parameters.AddWithValue("@Status", status.Text);

        try
        {
            conn.Open();
            cmd.ExecuteNonQuery();
        }
        catch
        {
            lblMessage.Text = "Error";
        }
        finally
        {
            conn.Close();
        }
    }
}

ストアの手順は次のとおりです。

    ALTER PROCEDURE InsertRecord1

    @AccountNumber int,
    @Amount nchar(10),
    @Provider nchar(10),
    @MobileNumber int,
    @TransNum nchar(10),
    @TransDate date,
    @Status nchar(10)

    AS
    Insert into TransDetails(AccountNumber,Amount,Provider,MobileNumber,TransNum,TransDate,Status) 
    Values (@AccountNumber,@Amount,@Provider,@MobileNumber,@TransNum,@TransDate,@Status)

    return

どんな助けにも本当に感謝します。P/S: ストアド プロシージャの先頭が "alter" で始まっている理由がわかりません。

4

5 に答える 5

1

読み方が間違っているかもしれませんが、ストアド プロシージャはまったく使用されていないようです。「cmd.CommandText = QueryA;」をコメントアウトしてみてください。「cmd.CommandText = "InsertRecord1";」を置き換えます CommandType を StoredProcedure に変更します。

ところで、QueryA には最後に括弧がありません。ただし、同じことを行うストアド プロシージャがあり、ほとんどの場合、埋め込み DML よりもストアド プロシージャを使用する方が望ましいため、すべてが不要です。

于 2012-10-05T03:10:06.117 に答える
1

Mobile Numberブラケット中にエスケープする必要があります

Insert into TransDetails(AccountNumber,Amount,Provider,[Mobile Number],...

スペースを削除しますparameter

...,@MobileNumber,@TransNum,@TransDate,@Status

コマンドパラメータのparamnameを変更します

cmd.Parameters.AddWithValue("@MobileNumber", lblNumber.Text);

しかし、あなたの を見るstored procedureと、列Mobile Numberの間にスペースがありません。に対するクエリの入力ミスQueryAですか? そうである場合は、そのスペースを削除します(パラメーター名も

Insert into TransDetails(AccountNumber,Amount,Provider,MobileNumber,...

また

に変更CommandType.TextしてCommandType.StoredProcedureこの行を削除し、

cmd.CommandText = QueryA;
于 2012-10-05T03:01:38.533 に答える
0

これを試すことができます:

using (SqlConnection conn = new SqlConnection (ConfigurationManager.ConnectionStrings["database"].ConnectionString))
        {                
            conn.Open();
            SqlCommand cmd = new SqlCommand("InsertRecord1", conn);

            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.AddWithValue("@AccountNumber", acc.Text);
            cmd.Parameters.AddWithValue("@Amount", lblAmount.Text);
            cmd.Parameters.AddWithValue("@Provider", lblProvider.Text);
            cmd.Parameters.AddWithValue("@Mobile Number", lblNumber.Text);
            cmd.Parameters.AddWithValue("@TransNum", lblTrans.Text);
            cmd.Parameters.AddWithValue("@TransDate", lblDate.Text);
            cmd.Parameters.AddWithValue("@Status", status.Text);

            try
            {                        
                cmd.ExecuteNonQuery();
            }
            catch
            {
                lblMessage.Text = "Error";
            }
            finally
            {
                conn.Close();
            }
        }

SQLコマンド、アダプターなどは使用しません。SQL データベースからデータにアクセスします。SQL Server からデータにアクセスするには、Microsoft が提供する使いやすいライブラリである Microsoft Data Access ApplicationBlocks を好みます。

ダウンロード ここからダウンロードできますhttp://download.microsoft.com/download/VisualStudioNET/daabref/RTM/NT5/EN-US/DataAccessApplicationBlock.msi

はじめ に http://www.4guysfromrolla.com/articles/062503-1.aspx

于 2012-10-06T03:09:44.787 に答える
0

SqlCommandコンストラクターの間違ったオーバーロードを使用しています。MSDNによると:

new SqlCommand(string, SqlConnection) クエリのテキストと SqlConnection を使用して、SqlCommand クラスの新しいインスタンスを初期化します。

あなたがする必要があるのはCommandType、SQLコマンドをに設定してCommandType.StoredProcedure使用しないQueryAか、SQLコマンドを初期化しQueryAてストアドプロシージャを使用しないことです。

于 2012-10-05T03:06:53.920 に答える
0

ご覧のとおり、SQL ステートメントの先頭に@があります。

また、実際にはストア プロシージャを使用していません。

于 2012-10-05T04:24:58.190 に答える