C# 如何使用C将数组元素插入SQL Server数据库?
我需要将天气预报温度插入SQL Server数据库,以便远程控制建筑物的供暖 这些步骤是: 从RSS提要获取数据 把它们排成一列 连接到SQL数据库 将元素插入SQL数据库 我做了前三步,但最后一步我被卡住了 该阵列是从Yahoo weather的RSS源创建的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数据库。我已经为此挣扎了好几个小时,但我不知道
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();
}