0

私は自分の C# アプリケーションで本当に苦労しています。以下のコードを実行するたびに、nvarchar データ型から int への変換に関するエラーが表示されます。キャストしてみましたが、うまくいかないようです。

ConnectionString myConnString = new ConnectionString();
string connString = myConnString.getConnectionString();
SqlConnection connValidate = new SqlConnection(connString);

SqlCommand cmdValidate = new SqlCommand("XXX", connValidate);
cmdValidate.CommandType = CommandType.StoredProcedure;

cmdValidate.Parameters.Add(new SqlParameter("@AccountID", currentUser));
cmdValidate.Parameters.Add(new SqlParameter("@PeriodMonth", Convert.ToString(comboBoxMonth.SelectedItem).Trim().ToUpper()));
cmdValidate.Parameters.Add(new SqlParameter("@PeriodYear", Convert.ToInt32(comboBoxYear.SelectedValue)));

connValidate.Open();

Int32 result = Convert.ToInt32(cmdValidate.ExecuteScalar());

connValidate.Dispose();
connValidate.Close();

私が使用しているストアドプロシージャは次のとおりです。

ALTER PROCEDURE [dbo].[XXX]
    @AccountID char(6),
    @PeriodMonth char(10),
    @PeriodYear int,
    @Date int,
    @PeriodID int,
    @InventoryID int,
    @ProductOutID int
AS
    SELECT @PeriodID = PeriodID FROM Periods
    WHERE PeriodMonth = @PeriodMonth AND PeriodYear = @PeriodYear AND AccountID = @AccountID

    SELECT @InventoryID = InventoryID FROM Fact 
    WHERE PeriodID = @PeriodID AND AccountID = @AccountID

    SELECT @ProductOutID = ProductOutID FROM Inventory
    WHERE InventoryID = @InventoryID

    SELECT DailyOutID FROM DailyOut
    WHERE ProductOutID = @ProductOutID AND Date = @Date
RETURN

ここでやりたいことは、ユーザーが入力した同じ月と年の期間がデータベースに既に存在するかどうかを確認することです。したがって、基本的に、入力された期間がすでに存在する場合、ストアド プロシージャは値を返す必要があります。存在する場合MessageBoxは、同じ期間の存在について警告するユーザーに表示されます。どうもありがとうございました!:)

4

4 に答える 4

0
  1. サーバーに送信されている正確なsqlを取得できるように、SQL プロファイラーを開始します。
  2. その SQL をクエリ アナライザーまたは SQL Management Studio にコピー アンド ペーストします。
  3. できればデバッグ モードで実行し、問題のある行番号を教えてください。

私の推測では、Periods.PeriodMonth は char(10) ではありませんが、エラーが発生している行を確認する必要があります。

于 2010-10-07T05:00:04.987 に答える
0

これを試して:

Int32 result = Int32.Parse(cmdValidate.ExecuteScalar());
于 2010-10-07T05:01:01.083 に答える
0

まず、cmdValidate.ExecuteScalar() が想定どおりの値を返していることを確認します。問題はストアドプロシージャにあると思います。その場合は、別のタグを付けて新しい質問を投稿することをお勧めします。

于 2010-10-07T14:05:48.810 に答える
0

@DailyOutID のような出力パラメーターを使用してみてください

SELECT @DailyOutID =  Cast(DailyOutID As Int) FROM DailyOut 
WHERE ProductOutID = @ProductOutID AND Date = @Date

そして、cmdValidate.Parameters からパラメーター コレクションからパラメーターを読み取ります。

于 2010-10-07T14:19:11.483 に答える