-1

これが私のストアドプロシージャです:

[dbo].[DFW_Completed_Safety] (
    @StartDate VARCHAR(10),
    @Station VARCHAR(50),
    @EmployeeID INT)

私が以下をコーディングするとき:

SqlDataAdapter daAC_CSM = new SqlDataAdapter();
DataSet dsAC_CSM = new DataSet();
try
{
    using (SqlConnection sqlConnection = new SqlConnection(connectionString))
    {
        sqlCmd = new SqlCommand();
        sqlCmd.CommandType = CommandType.StoredProcedure;               
        sqlCmd.Connection = sqlConnection;
        sqlCmd.CommandTimeout = 0;
        sqlCmd.CommandText = "DFW_Completed_Safety";
        sqlCmd.Parameters.AddWithValue("@StartDate", startdate);
        sqlCmd.Parameters.AddWithValue("@Station", station);
        sqlCmd.Parameters.AddWithValue("@EmployeeID", "0");
        daAC_CSM.SelectCommand = sqlCmd;
        daAC_CSM.Fill(dsAC_CSM);
    }
    return dsAC_CSM;
}
catch (Exception)
{
    throw;
}

例外をスローします。EmployeeIDはvarcharとして受信されます。

Conversion failed when converting the varchar value 'd ' to data type int.

私が試したこと:

1- StackOverflowに投稿された他の多くの人は、そうすることを提案しConvert.ToInt32(0);ました。0はデフォルトでInt32であるため、これは解決策ではありません。
2- varcharを受け取るようにメソッドを変更し(「0」を送信)、それも機能しません。

アイデアをありがとう!(メソッドのシグネチャをIntに保持する方が大きいでしょう)。

更新:ストアドプロシージャをvarcharに変更してもうまくいかなかったため、質問にはまだ回答されていません。何かアイデアはありますか?

4

3 に答える 3

0

最後に、それは最初の行ではありませんでした。FormName は FormID を格納するフィールドです。以前ここにいたプログラマーはおそらく初心者であるか、列のデータ型を int に変更したため、すべてのクエリが機能しませんでした。とにかく@Matt_Whitfieldと@Luxspesに感謝します。ちなみにLuxpes、あなたは正しかった、それはSSMSでも1行目と書かれていたが、私は同じものを使ってそれをやった:

EXEC    @return_value = [dbo].[DFW_Completed_Safety]
        @StartDate = N'07-18-2012',
        @Station = N'YHZ',
        @EmployeeID = 0

そして、Print @SqlStatement を実行することで、新しいクエリにコピー アンド ペーストし、それがInt である Form* Name * であることを確認できました。Name が Int になる可能性があることを誰が知っていましたか?

于 2012-07-23T18:24:34.637 に答える
0

SSMS からプロシージャを実行すると、同じエラーが発生する可能性が高くなります。これは、エラーがプロシージャの呼び出し方法ではなく、プロシージャの本体に由来する可能性が高いためです。クエリを実行しているテーブルの列に値「d」があり、その列を整数型と比較している場合、そのエラーが発生します。また、いくつかの余談:

  • インスタンスは IDisposable であるため、インスタンスを using 句にSqlCommand入れるか、手動で破棄する必要があります。SqlConnection
  • おそらく catch ブロックには入れたくないでしょthrow exう - おそらくただ欲しいだけですthrow。使用throw exすると、元の例外で利用可能だったスタック トレースが台無しになります。
于 2012-07-23T15:10:27.187 に答える
0

次のようにコードを書き直してください。

try
{
    sqlCon = new SqlConnection(connectionString);
    sqlCmd = new SqlCommand();
    sqlCmd.CommandType = CommandType.StoredProcedure;
    SqlDataAdapter daAC_CSM = new SqlDataAdapter();
    DataSet dsAC_CSM = new DataSet();
    sqlCmd.Connection = sqlCon;
    sqlCmd.CommandTimeout = 0;
    sqlCmd.CommandText = "DFW_Completed_Safety";
    sqlCmd.Parameters.AddWithValue("@StartDate", startdate);  //Using "@"
    sqlCmd.Parameters.AddWithValue("@Station", station);    //Using "@"
    sqlCmd.Parameters.AddWithValue("@EmployeeID", 0); //Using "@"

    foreach(SqlParameter p in  sqlCmd.Parameters){
      //Will print Name, Type and Value
      System.Diagnostics.Trace.WriteLine("Name:" + p.ParameterName + "Type: " + p.DbType+" Value: "+p.Value); 
    }

    sqlCon.Open();
    daAC_CSM.SelectCommand = sqlCmd;
    daAC_CSM.Fill(dsAC_CSM);
    sqlCon.Close();
    return dsAC_CSM;
}
catch (Exception ex)
{
    throw ex;
}

それは何を印刷しますか?どのようなエラーが表示されますか?

于 2012-07-22T23:53:15.930 に答える