1

コードを実行すると、次のエラーが発生する理由を誰か教えてください。これは問題ないように思われるため、SQLステートメントに問題があるかどうかはわかりませんが、セカンドオピニオン

「文字列から日時を変換する際に変換に失敗しました」

public static int GetConveyorProductionCount(string machineNameV, string StartTimeV, string EndTimeV)
    {

        try
        {
            int count;

            SqlParameter param01 = new SqlParameter("@param01", SqlDbType.VarChar, 5);
            param01.Value = machineNameV;

            SqlParameter param02 = new SqlParameter("@param02", SqlDbType.VarChar, 5);
            param02.Value = StartTimeV;

            SqlParameter param03 = new SqlParameter("@param03", SqlDbType.VarChar, 5);
            param03.Value = EndTimeV;

            SqlCommand getConveyorProductionSC = new SqlCommand("SELECT cast([" + machineNameV + "] as int) FROM VWCONVEYORPRODUCTION WHERE([DA_TE] BETWEEN @param02 AND @param03)", myConnection);

            getConveyorProductionSC.Parameters.Add(param01);
            getConveyorProductionSC.Parameters.Add(param02);
            getConveyorProductionSC.Parameters.Add(param03);

            myConnection.Open();
            object result = getConveyorProductionSC.ExecuteScalar();
            myConnection.Close();

            if (result == DBNull.Value)
            {
                count = 0;
            }
            else
            {
                count = Convert.ToInt32(result);
            }

            return count;
        }
        catch (Exception e)
        {
            throw new Exception("Error retrieving the Conveyor production count. Error: " + e.Message);
        }
4

3 に答える 3

5

このコードに関する他の多くの問題は別として

SqlParameter param02 = new SqlParameter("@param02", SqlDbType.DateTime);
param02.Value = StartTimeV;
SqlParameter param03 = new SqlParameter("@param03", SqlDbType.DateTime);
param03.Value = EndTimeV;

もちろん、テーブルの DA_TE 列が日時であると仮定すると、良いスタートになりますか? もちろん、DateTimes としても渡す必要があります。

ただし、パラメーター化されたクエリを使用することをお勧めします。

それが私だったら、私のコードは次のようになります

public static int GetConveyorProductionCount(string machineNameV, DateTime StartTimeV, DateTime EndTimeV)
{
  {
  using (SqlConnection connection = new SqlConnection(myConnectionString))
  {
    connection.Open();
    using(SqlCommand command = new SqlCommand(String.Format(CultureInfo.InvariantCulture, "SELECT cast([{0}] as int) FROM VWCONVEYORPRODUCTION WHERE([DA_TE] BETWEEN @StartDate AND @EndDate)", machineNameV), connection);            
    {
      command.Parameters.AddWithValue("StartDate",StartTimeV);
      command.Parameters.AddWithValue("EndDate",EndTimeV);
      object result = command.ExecuteScalar();
      if (result == DBNull.Value)
      {
        return 0;
      }
      else
      {
        return (Int32)result;
      }
    }
  }
}

IDisposable を実装するフライで作成したものはすべて、using ブロック内に配置されます。

明示的なトランザクションを行っている場合、または接続キャッシュをオフにして Ado.Net db 接続を保持している場合を除き、しないでください。

DateTime を DateTime として渡す

変数に適切な名前を付けてください。param02 は何の意味もありません。count は誤解を招くものでした。

必要になる前に物を作らない

あなたが例外で行ったことは、個人的には、例外に関するすべての有用な詳細を捨てた後、特に単純にもう一度スローするために、このコードにトラップすることはしません。

これを行う場合は、CustomException を定義してから、new MyCustomException("コンベアの生産数を取得中にエラーが発生しました。",e); をスローします。

そうすれば、必要に応じてこの特定の例外をトラップできますが、例外チェーン全体とすべてのスタック トレースが得られます。

最後に大事なことを言い忘れましたが、私のものを含むすべてのコーディング例を、あたかも村の馬鹿のいとこによって作成されたかのように扱ってください。:D

于 2012-10-05T09:01:41.240 に答える
1

私の理論は、DateTime として渡された文字列が正しい形式ではないということです。

以下の例を見てください

実用的な価値の SQL Fiddle DEMO

壊れた値の SQL Fiddle DEMO

01 Ja 2012を使用する 2 番目の例( JanではなくJaに注意してください) では、エラー メッセージが生成されます。

文字列から日時を変換する際に変換に失敗しました

于 2012-10-05T08:57:00.150 に答える
1

あなたの問題は、VWCONVEYORPRODUCTION テーブルの DA_TE 列が SQL 日付型であることだと思います。したがって、これは、パラメーターも日付型である必要があることを意味します。

public static int GetConveyorProductionCount(string machineNameV, DateTime StartTimeV, DateTime EndTimeV)
    {
    enter code here
        try
        {
            int count;

            SqlParameter param01 = new SqlParameter("@param01", SqlDbType.VarChar, 5);
            param01.Value = machineNameV;

            SqlParameter param02 = new SqlParameter("@param02", SqlDbType.date);
            param02.Value = StartTimeV;

            SqlParameter param03 = new SqlParameter("@param03", SqlDbType.date);
            param03.Value = EndTimeV;

            SqlCommand getConveyorProductionSC = new SqlCommand("SELECT cast([" + machineNameV + "] as int) FROM VWCONVEYORPRODUCTION WHERE([DA_TE] BETWEEN @param02 AND @param03)", myConnection);

            getConveyorProductionSC.Parameters.Add(param01);
            getConveyorProductionSC.Parameters.Add(param02);
            getConveyorProductionSC.Parameters.Add(param03);

            myConnection.Open();
            object result = getConveyorProductionSC.ExecuteScalar();
            myConnection.Close();

            if (result == DBNull.Value)
            {
                count = 0;
            }
            else
            {
                count = Convert.ToInt32(result);
            }

            return count;
        }
        catch (Exception e)
        {
            throw new Exception("Error retrieving the Conveyor production count. Error: " + e.Message);
        }

DateTime.ParseExact()この関数を呼び出す前に文字列を DateTime に変換する必要がある場合に使用します。

于 2012-10-05T09:01:50.590 に答える