如何使用C#将数组元素插入SQL Server数据库?

Yoa*_*oan 4 c# sql sql-server arrays sqlcommand

我需要将天气预报(温度)插入SQL Server数据库,以便远程控制建筑物的供暖.

步骤是:

  1. 从RSS源获取数据
  2. 将它们放在一个数组中
  3. 连接到SQL数据库
  4. 将元素插入SQL数据库

我做了3个第一步,但我坚持使用最后一个.

该阵列是从Yahoo weather的RSS feed创建的.

string[,] myarray1 = new string[5, 3];
Run Code Online (Sandbox Code Playgroud)

数据库列的名称是:Date,Templow,Temphigh

我现在正在尝试将此数组的元素插入SQL Server数据库.几个小时我一直在努力,我无法弄清楚如何做到这一点.我在这个网站上看了很多解决方案而没有成功.

我试过了:

foreach (string str2 in myarray1)
{
    var mycommand = new SqlCommand("INSERT INTO RSS2 VALUES(@Date, @Templow, @Temphigh)", myConnection);
    mycommand.Parameters.AddWithValue("@Date", str2);
    mycommand.Parameters.AddWithValue("@Templow", str2);
    mycommand.Parameters.AddWithValue("@Temphigh", str2);
    mycommand.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)

for (k = 0; k < 5; k++)
{
    SqlCommand myCommand = new SqlCommand("INSERT INTO RSS2 (Date, Templow, Temphigh)" +
            "Values ('myarray1[k,0]','myarray1[k,1]','myarray1[k,2]')", myConnection);
    myCommand.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)

和许多其他人......

这些解决方案都没有得到纠正.这是我在c#中的第一个代码(我习惯了Basic),所以要小心;-)

Ste*_*eve 7

假设您的数据库表需要一个日期和两个低温和高温的双精度值,那么您可以在循环外部构建命令及其参数,然后只更新循环内的参数值.

var mycommand = new SqlCommand("INSERT INTO RSS2 VALUES(@Date, @Templow, @Temphigh)", 
                               myConnection);

mycommand.Parameters.AddWithValue("@Date", DateTime.MinValue);
mycommand.Parameters.AddWithValue("@Templow", Double.MinValue);
mycommand.Parameters.AddWithValue("@Temphigh", Double.MinValue);
for (i = 0; i < 5; i++)
{
    mycommand.Parameters["@Date"].Value = Convert.ToDateTime(myArray[i,0]);   
    mycommand.Parameters["@Templow"].Value = Convert.ToDouble(myArray[i,1]);   
    mycommand.Parameters["@Temphigh"].Value = Convert.ToDouble(myArray[i,2]);    
    mycommand.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)

另一个有趣的选择可能是使用表值参数,但它不仅仅是五行的大增益.相反,如果要添加许多行,它可能是差异制造者

在Sql Server中,db为参数和插入记录的存储过程创建数据类型

CREATE TYPE dbo.WeatherInfo AS TABLE
( infoDate smalldatetime, minTemp float, maxTemp float )

CREATE PROCEDURE usp_InsertWeatherInfo
(@tbpWeatherInfo dbo.WeatherInfo READONLY)
AS
    INSERT INTO dbo.RSS2 (dateInfo, minTemp, maxTemp)
    SELECT wi.dateInfo, wi.minTemp, wi.maxTemp FROM @tbpWeatherInfo AS wi
Run Code Online (Sandbox Code Playgroud)

在您的C#代码而不是数组中创建一个具有date,min和max temp的数据表,并将其传递给存储过程

using (connection)
{
      DataTable wiInfo = GetWeatherInfo();
      SqlCommand insertCommand = new SqlCommand("usp_InsertWeatherInfo", connection);
      insertCommand.CommandType = CommandType.StoredProcedure;
      SqlParameter tvpParam = insertCommand.Parameters.AddWithValue("@tbpWeatherInfo", wiInfo);
      tvpParam.SqlDbType = SqlDbType.Structured;
      insertCommand.ExecuteNonQuery();
}

private DataTable GetWeatherInfo()
{
    DataTable wi = new DataTable();
    wi.Columns.Add("infoDate", typeof(DateTime));
    wi.Columns.Add("minTemp", typeof(double));
    wi.Columns.Add("maxTemp", typeof(double));

    ... loop reading aline of weather info ....
        DataRow row = wi.NewRow();
        wi["infoDate"] = ... datetime from line ....
        wi["minTemp"] = ... minTemp from line ....
        wi["maxTemp"] = ... maxTemp from line ....
        wi.Rows.Add(row);
    ... next line
    return wi;
}
Run Code Online (Sandbox Code Playgroud)