【解決方法】コードの実行中にエラーが発生します。以下がエラーです。


System.Data.SqlClient.SqlException: ‘nvarchar データ型を datetime データ型に変換すると、範囲外の値になりました。
ステートメントは終了されました。’

私が試したこと:

private void SaveImportDataToDatabase(DataTable S2P5)
       {

           using (SqlConnection conn = new SqlConnection(@"Data Source=BBKUL035\SQLEXPRESS; Initial Catalog=HoDB; User Id=sa; Password=1234"))

           {

               conn.Open();
               foreach (DataRow importRow in S2P5.Rows)
               {

                   SqlCommand cmd = new SqlCommand
                       ("INSERT INTO S2P5 (DateTime,Miliseconds,MachineAutoStartStop,Pressure,Batch,UPCurrent,LPCurrent,LinearSensor,Load,SlidePosition,Step1,Step2,Step3,Step4,Step5,Step6,Step7,Step8,Step9,Step10,UPPlatePosition,LPPlatePosition,SunGearPosition,InternalGearPosition)" + "VALUES (@DateTime,@Miliseconds,@MachineAutoStartStop,@Pressure,@Batch,@UpCurrent,@LpCurrent,@LinearSensor,@Load,@SlidePosition,@Step1,@Step2,@Step3,@Step4,@Step5,@Step6,@Step7,@Step8,@Step9,@Step10,@UPPlatePosition,@LPPlatePosition,@SunGearPosition,@InternalGearPosition)", conn);


                   cmd.Parameters.AddWithValue("@DateTime", importRow["DateTime"]);
                   cmd.Parameters.AddWithValue("@Miliseconds", importRow["Miliseconds"]);
                   cmd.Parameters.AddWithValue("@MachineAutoStartStop", importRow["MachineAutoStartStop"]);
                   cmd.Parameters.AddWithValue("@Pressure", importRow["Pressure"]);
                   cmd.Parameters.AddWithValue("@Batch", importRow["Batch"]);
                   cmd.Parameters.AddWithValue("@UPCurrent", importRow["UPCurrent"]);
                   cmd.Parameters.AddWithValue("@LPCurrent", importRow["LPCurrent"]);
                   cmd.Parameters.AddWithValue("@LinearSensor", importRow["LinearSensor"]);
                   cmd.Parameters.AddWithValue("@Load", importRow["Load"]);
                   cmd.Parameters.AddWithValue("@SlidePosition", importRow["SlidePosition"]);
                   cmd.Parameters.AddWithValue("@Step1", importRow["Step1"]);
                   cmd.Parameters.AddWithValue("@Step2", importRow["Step2"]);
                   cmd.Parameters.AddWithValue("@Step3", importRow["Step3"]);
                   cmd.Parameters.AddWithValue("@Step4", importRow["Step4"]);
                   cmd.Parameters.AddWithValue("@Step5", importRow["Step5"]);
                   cmd.Parameters.AddWithValue("@Step6", importRow["Step6"]);
                   cmd.Parameters.AddWithValue("@Step7", importRow["Step7"]);
                   cmd.Parameters.AddWithValue("@Step8", importRow["Step8"]);
                   cmd.Parameters.AddWithValue("@Step9", importRow["Step9"]);
                   cmd.Parameters.AddWithValue("@Step10", importRow["Step10"]);
                   cmd.Parameters.AddWithValue("@UPPlatePosition", importRow["UPPlatePosition"]);
                   cmd.Parameters.AddWithValue("@LPPlatePosition", importRow["LPPlatePosition"]);
                   cmd.Parameters.AddWithValue("@SunGearPosition", importRow["SunGearPosition"]);
                   cmd.Parameters.AddWithValue("@InternalGearPosition", importRow["InternalGearPosition"]);


                   cmd.ExecuteNonQuery();
               }

           }

解決策 1

System.Data.SqlClient.SqlException: 'The conversion of a nvarchar data type to a datetime data type resulted in an out-of-range value.

うん。 nvarchar Sql 英数字フィールド (別名 string)そしてあなたはプッシュしようとしています DateTime それに。

Sql フィールドは DateTime 分野。 変換したい場合 DateTimestring コードでそれを行う必要があります。 これは最適な解決策ではありません。 Sqlフィールドをに変更する必要があります DataTime 分野。 これは次のように重要です。 string とは異なる方法で処理されます DateTime、特に並べ替えとフィルタリングに関しては。

解決策 2

問題は、AddWithValue がどのように機能するかを理解していないことです。

これらの呼び出しには、パラメーターの名前と値の 2 つを指定しています。 では、AddWithValue はどのようにしてデータをフォーマットして SQL に渡すことができるのでしょうか? データ自体は調べませんが、データの型、string、int、DateTime などを調べます。

AddWithValue へのすべての呼び出しに文字列しか渡さないため、コードが生成するすべてのパラメーターは、SQL への文字列として、または SQL が NVARCHAR 型を呼び出すものとして扱われます。 これを修正するには、渡すデータを適切な型に変換してから、AddWithValue に渡す必要があります。

C#
cmd.Parameters.AddWithValue("@DateTime", importRow["DateTime"]);

becomes

// I'm assuming your data can even be cast to a DateTime type
cmd.Parameters.AddWithValue("@DateTime", (DateTime)importRow["DateTime"]);

コメント

タイトルとURLをコピーしました