2016-10-25 15 views
1

.net c#で作業しています。テーブルにデータを挿入したいと思います。C#挿入クエリでスカラー変数 "@SomeThing"を宣言する必要があります。

私はVisual Studioでの書き込みクエリであり、ストアドプロシージャを使用していません。

それはif一部になりしないと私はMust declare the scalar variable "@Occurrence_Time"という名前の例外を取得しています。これは、私のクエリ

SqlCommand cmd2 = new SqlCommand("insert into Device_Events (Device_ID, Event_ID, Occurrence_Time, Recovery_Time) values (@Device_ID , @Event_ID, @Occurrence_Time, @Recovery_Time)", con); 

であり、これはそれで

// For Events 
string formatString = "yyMMddHHmmss"; 
DateTime Occurrence_Time, Recovery_Time; 
string strOccurrence = Meter_data.Substring(161, 12); 
string strRecovery = Meter_data.Substring(173, 12); 

cmd2.Parameters.AddWithValue("@Device_ID", device_Id); 
cmd2.Parameters.AddWithValue("@Event_ID", event_Id); 

if (DateTime.TryParseExact(strOccurrence, formatString, CultureInfo.InvariantCulture, DateTimeStyles.None, out Occurrence_Time)) 
{ 
    if (DateTime.TryParseExact(strRecovery, formatString, CultureInfo.InvariantCulture, DateTimeStyles.None, out Recovery_Time)) 
    { 
     cmd2.Parameters.AddWithValue("@Occurrence_Time", SqlDbType.DateTime).Value = Occurrence_Time; 
     cmd2.Parameters.AddWithValue("@Recovery_Time", SqlDbType.DateTime).Value = Recovery_Time; 
    } 
} 

int Device_Events_rows_executed = cmd2.ExecuteNonQuery(); 
Console.WriteLine("Rows Executed: '{0}'", Device_Events_rows_executed); 

を値を渡すための私のC#コードであります

また、私はこのlinkを読んだが、助けを見つけることができませんでした。

それは私とエラーまたは例外を示すないですが、それでも、それは両方のif条件に入っていませんが、私はコード

  cmd2.Parameters.Add("@Device_ID", SqlDbType.VarChar, 50).Value = device_Id; 
      cmd2.Parameters.Add("@Event_ID", SqlDbType.VarChar, 50).Value = event_Id; 
      cmd2.Parameters.Add("@Occurrence_Time", SqlDbType.DateTime, 50).Value = DBNull.Value; 
      cmd2.Parameters.Add("@Recovery_Time", SqlDbType.DateTime, 50).Value = DBNull.Value; 

      string formatString = "yyMMddHHmmss"; 
      DateTime Occurrence_Time, Recovery_Time; 
      string strOccurrence = Meter_data.Substring(161, 12); 
      string strRecovery = Meter_data.Substring(173, 12); 

      if (DateTime.TryParseExact(strOccurrence, formatString, CultureInfo.InvariantCulture, DateTimeStyles.None, out Occurrence_Time)) 
      { 
       cmd2.Parameters["@Occurrence_Time"].Value = Occurrence_Time; 
      } 
      if (DateTime.TryParseExact(strRecovery, formatString, CultureInfo.InvariantCulture, DateTimeStyles.None, out Recovery_Time)) 
      { 
       cmd2.Parameters["@Recovery_Time"].Value = Recovery_Time; 
      } 

の以下の部分を追加した提案の後に更新されたコード

助けを歓迎します

+0

すべてのクエリパラメータには常に値を指定する必要があります。間違った形式で開始されたデータがあっても、これは変わらないからです。 – Richard

+0

実際のコードですか?あなたは 'AddWithValue'を使用していますが、あなたが' Add'を使用しようとしているかのように引数を渡しています - 私は[AddWithValue'をまったく使っていません](http://blogs.msmvps.com/jcoehoorn/blog/2014/05)/12/can-we-stop-using-addwithvalue-already /)を使用します。 – GarethD

+0

あなたの列のタイプは何ですか?Occurrence_Time? –

答えて

1

すべてのパラメータを宣言する必要がありますが、 SS欠落している日付の場合はnullまたはデフォルト値:ので、あなたの条件付きフローの、述べたように

if (DateTime.TryParseExact(strOccurrence, formatString, CultureInfo.InvariantCulture, DateTimeStyles.None, out Occurrence_Time)) 
{    
    cmd2.Parameters.AddWithValue("@Occurrence_Time", SqlDbType.DateTime).Value = Occurrence_Time;     
} 
else 
{ 
    cmd2.Parameters.AddWithValue("@Occurrence_Time", SqlDbType.DateTime).Value = null; 
} 
+0

実際に私はメーターからデータを取得しています。イベントデータを送信していますが、特定のイベントの正確なデバイスIDを取得していますが、すべてのケースで内部には入りません。 – faisal1208

+1

'strOccurrence'内のサブ文字列は' yyMMddHHmmss'と一致しません。そうでなければ 'DateTime.TryParseExact'は' true'を返します。 – fubo

+0

最初は一致しました。何が起こったのかわかりません。 – faisal1208

0

、あなたは試してみて、コマンドにパラメータを追加することなく、cmd2を実行するコードパスがあります。

値がない場合でも、コマンドにパラメータを追加する必要があります。あなたの文字列が日付として正しく解析あれば、後に続いて

cmd2.Parameters.Add("@Device_ID", SqlDbType.VarChar, 50).Value = device_Id; 
cmd2.Parameters.Add("@Event_ID", SqlDbType.VarChar, 50).Value = event_Id; 
cmd2.Parameters.Add("@Occurrence_Time", SqlDbType.DateTime, 50).Value = DBNull.Value; 
cmd2.Parameters.Add("@Recovery_Time", SqlDbType.DateTime, 50).Value = DBNull.Value; 

パラメータの値を更新します:私は(というAddWithValue()よりAdd()を使用して)開始時にすべてのパラメータを設定することをお勧めしたい

if (DateTime.TryParseExact(strOccurrence, formatString, CultureInfo.InvariantCulture, DateTimeStyles.None, out Occurrence_Time)) 
{ 
    cmd2.Parameters["@Occurrence_Time"].Value = Occurrence_Time; 
} 
if (DateTime.TryParseExact(strRecovery, formatString, CultureInfo.InvariantCulture, DateTimeStyles.None, out Recovery_Time)) 
{ 
    cmd2.Parameters["@Recovery_Time"].Value = Recovery_Time; 
} 

EDIT

あなたはデータが常に正しいとなることを非常に自信を持っているようですので、あなたにもちょうどParseExactの代わりを使用することができます0:

var occuranceDate = DateTime.ParseExact(Meter_data.Substring(161, 12), "yyMMddHHmmss", CultureInfo.InvariantCulture); 
var recoveryDate = DateTime.ParseExact(Meter_data.Substring(173, 12), "yyMMddHHmmss", CultureInfo.InvariantCulture); 

cmd2.Parameters.Add("@Device_ID", SqlDbType.VarChar, 50).Value = device_Id; 
cmd2.Parameters.Add("@Event_ID", SqlDbType.VarChar, 50).Value = event_Id; 
cmd2.Parameters.Add("@Occurrence_Time", SqlDbType.DateTime, 50).Value = occuranceDate' 
cmd2.Parameters.Add("@Recovery_Time", SqlDbType.DateTime, 50).Value = recoveryDate; 

int Device_Events_rows_executed = cmd2.ExecuteNonQuery(); 
Console.WriteLine("Rows Executed: '{0}'", Device_Events_rows_executed); 
+0

このコードを追加しますが、 ** 400 **サイズの文字列で、160が満たされ、残りが25個の25個のチャンクと25個のチャンクに分割されます。12は発生のためのもので、12個は回復と残りのものです。 ng 1はコンマ用ですので、 'string strOccurrence = Meter_data.Substring(161,12);を追加しました。 string strRecovery = Meter_data.Substring(173、12); ' – faisal1208

+0

更新されたコードがわかりました – faisal1208

+0

日付が有効な形式でない場合、例外をスローしたいですか?文字列の値が変換に失敗していることを確認するコードをデバッグしようとしましたか? – GarethD

関連する問題