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

C# 如何使用C将数组元素插入SQL Server数据库?,c#,sql,sql-server,arrays,sqlcommand,C#,Sql,Sql Server,Arrays,Sqlcommand,我需要将天气预报温度插入SQL Server数据库,以便远程控制建筑物的供暖 这些步骤是: 从RSS提要获取数据 把它们排成一列 连接到SQL数据库 将元素插入SQL数据库 我做了前三步,但最后一步我被卡住了 该阵列是从Yahoo weather的RSS源创建的 string[,] myarray1 = new string[5, 3]; 数据库列的名称为:Date、Templow、Temphigh 我现在尝试将此数组的元素插入SQL Server数据库。我已经为此挣扎了好几个小时,但我不知道

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

这些步骤是:

从RSS提要获取数据 把它们排成一列 连接到SQL数据库 将元素插入SQL数据库 我做了前三步,但最后一步我被卡住了

该阵列是从Yahoo weather的RSS源创建的

string[,] myarray1 = new string[5, 3];
数据库列的名称为: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();
}

还有很多其他的

这些解决方案没有一个是正确的。
这是我第一个用c写的代码,我习惯了Basic,所以请记住-

假设您的数据库表需要一个日期和两个用于low和high temp的双值,那么您可以在循环外部构建命令及其参数,然后只更新循环内部的参数值

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();
}
在C代码中,而不是数组中,创建一个带有日期、最小温度和最大温度的数据表,并将其传递给存储过程

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;
}

两种解决方案都很接近,但并不完全正确

但是,我建议创建一个简单的类,称之为WeatherInfo

你可以这样初始化它

WeatherInfo weather = new WeatherInfo("01/01/2014", "56F", "89F");
然后你可以使用一个数组,WeatherInfo[]

您仍然可以使用索引infos[0]访问它,以访问WeatherInfo对象。然后您可以更轻松地使用第一个解决方案

foreach (WeatherInfo info in infos)
{
    var mycommand = new SqlCommand("INSERT INTO RSS2 VALUES(@Date, @Templow, @Temphigh)", myConnection);
    mycommand.Parameters.AddWithValue("@Date", info.Date);
    mycommand.Parameters.AddWithValue("@Templow", info.TempLow);
    mycommand.Parameters.AddWithValue("@Temphigh", info.TempHigh);
    mycommand.ExecuteNonQuery();
}
或者你的第二个解决方案

for (i = 0; i < infos.Length; i++)
{
    SqlCommand myCommand = new SqlCommand(
        "INSERT INTO RSS2 (Date, Templow, Temphigh)" +
        "Values ('" + infos[i].Date + "','" + infos[i].TempLow + "','" + infos[i].TempHigh + "')", 
        myConnection);
    myCommand.ExecuteNonQuery();
}

但是,第二个解决方案存在一个称为的安全漏洞,一些攻击者可能会插入不需要的SQL,如1;从表中选择*;在字符串值中,然后将其传递到数据库,而不验证它是否是这些命令类型的内容。

问题在于如何处理字符串的多维数组。您需要使用forint i=0;i<数组长度;i++并将数组[i,x]x的参数设置为该参数的行,然后在forCorrect me中执行查询。如果我错了,我是否看到mycommand.parameters[@Date],Convert.ToDateTimemyArray[i,0];不是以AddWithValue结尾,而是以?其思想是在循环外部初始化参数集合,以避免对每个循环的集合进行不断的重新初始化。在循环外部设置伪初始值,在循环内部仅使用实际数组数据更改值。但是您是对的,因为在通常的复制/粘贴错误中,答案中出现了一些无效字符。现在应该修复。@LearningNeverStops如果没有错,for中的代码将无法工作编辑:现在可以工作了:不过,您不希望在for中使用硬编码的“5”。需要使用array.length您还需要使用查询参数。为此创建一个简单的类是一件好事:C是面向对象的,这实际上是最好的方法。@snaplemouton True,已更改。@DanBracuk谢谢。我为OP的两个原始解决方案都添加了一个版本,包括使用查询参数的解决方案=
WeatherInfo weather = new WeatherInfo("01/01/2014", "56F", "89F");
WeatherInfo[] infos = new WeatherInfo[5];
foreach (WeatherInfo info in infos)
{
    var mycommand = new SqlCommand("INSERT INTO RSS2 VALUES(@Date, @Templow, @Temphigh)", myConnection);
    mycommand.Parameters.AddWithValue("@Date", info.Date);
    mycommand.Parameters.AddWithValue("@Templow", info.TempLow);
    mycommand.Parameters.AddWithValue("@Temphigh", info.TempHigh);
    mycommand.ExecuteNonQuery();
}
for (i = 0; i < infos.Length; i++)
{
    SqlCommand myCommand = new SqlCommand(
        "INSERT INTO RSS2 (Date, Templow, Temphigh)" +
        "Values ('" + infos[i].Date + "','" + infos[i].TempLow + "','" + infos[i].TempHigh + "')", 
        myConnection);
    myCommand.ExecuteNonQuery();
}