C# 在多个select语句上运行参数化查询
我有一段代码,用于用新数据更新Foxpro表,但是为了获得这些数据,我需要运行多个select语句。我的理论是使用参数化查询,但是现在我收到了错误 索引超出了数组的边界 我假设这是因为我有多个SELECT语句,但是我不能用join运行它,因为这些表之间没有链接 下面是连接字符串和原始Select语句C# 在多个select语句上运行参数化查询,c#,visual-foxpro,C#,Visual Foxpro,我有一段代码,用于用新数据更新Foxpro表,但是为了获得这些数据,我需要运行多个select语句。我的理论是使用参数化查询,但是现在我收到了错误 索引超出了数组的边界 我假设这是因为我有多个SELECT语句,但是我不能用join运行它,因为这些表之间没有链接 下面是连接字符串和原始Select语句 using (var importConnection = new OleDbConnection( connectionString: @"Provider=vfpoled
using (var importConnection = new OleDbConnection(
connectionString: @"Provider=vfpoledb.1;
Exclusive=false;
data source=C:\Users\Joshua.cameron\Desktop\PCHomesImportTestBlank\PCHomesServer\DATABASE\pchomes.dbc")
)
using (OleDbCommand CodeChange = new OleDbCommand(
@"select NUM
from SYSTEMNUMBERS;
select PROPCODE from PROPERTY order by PROPCODE", importConnection))
以及要调用和更新的代码
importConnection.Open();
Console.WriteLine("Visual Foxpro connection open");
// Initiate the reader to SQL
var exportReader = CodeChange.ExecuteReader();
// Start reading
while (exportReader != null && exportReader.Read())
{
// Set parameter values whilst reading from SQL
Int32 currentNum = Int32.Parse(exportReader.GetInt32(0).ToString());
string propcode = exportReader.GetValue(1).ToString();
currentNum = currentNum + 1;
string padprop = currentNum.ToString().PadLeft(3);
string propcode2 = "BIDME_" + padprop;
// insert into VFP
var propins = new OleDbCommand(@"update PROPERTY set PROPCODE=" + propcode2 + "where PROPCODE=" + propcode);
var clientins = new OleDbCommand(@"update CLIENT set PROPCODET="+ propcode2 + "where PROPCODET=" + propcode);
try
{
propins.ExecuteNonQuery();
}
catch (Exception p)
{
Console.Write("Error!");
Console.Write(p);
Console.Read();
}
try
{
clientins.ExecuteNonQuery();
}
catch (Exception c)
{
Console.Write("Error!");
Console.Write(c);
Console.Read();
}
try
{
CodeChange.ExecuteNonQuery();
}
catch (Exception e)
{
Console.Write("Error Writing to database");
Console.Write(e);
Console.ReadKey();
}
}
// done
Console.WriteLine("Complete!");
importConnection.Close();
}
错误的确切原因是试图读取DataReader索引1处字段的行。您似乎假设您有两个字段,因为您有两个选择。但OleDbDataReader不是这样工作的。您的命令生成两组不同的数据,每个数据只有一个字段。第一次选择将生成第一个结果,这是您正在循环的集合 不能将两个结果合并在一起,并在同一循环中使用它们的值。首先需要使用所有第一个结果,然后使用OleDbDataReader的方法传递给第二个结果,并启动另一个调用Read()的循环 警告我不确定visual foxpro提供程序是否在同一命令中支持多个select语句。如果没有,那么您没有任何选择,只能发出两个单独的命令 但是,看看您的代码,似乎每个表的记录数相同,而且两个表之间没有明显的关系。
在这个场景中(并且假设您没有要处理的大型结果集),我可以简单地加载两个数据表,然后使用这两个表的数据行进行更新
using (var importConnection = new OleDbConnection(....))
using (OleDbCommand CodeChange = new OleDbCommand(
@"select NUM from SYSTEMNUMBERS;
select PROPCODE from PROPERTY order by PROPCODE", importConnection))
{
importConnection.Open();
DataTable sysNum = new DataTable();
DataTable props = new DataData();
Console.WriteLine("Visual Foxpro connection open");
var exportReader = CodeChange.ExecuteReader();
sysNum.Load(exportReader);
exportReader.NextResult();
props.Load(exportReader);
for (int x = 0; x < sysNum.Rows.Count; x++)
{
// Set parameter values whilst reading from SQL
Int32 currentNum = Int32.Parse(sysNum.Rows[i][0]);
string propcode = props.Rows[i][0].ToString();
.... continue with your current code ....
.... but remove this part.....
// try
// {
// CodeChange.ExecuteNonQuery();
// }
// catch (Exception e)
// {
// Console.Write("Error Writing to database");
// Console.Write(e);
// Console.ReadKey();
// }
}
}
// done
Console.WriteLine("Complete!");
使用(var importConnection=new OleDbConnection(..)
使用(OleDbCommand CodeChange=新OleDbCommand)(
@“从SystemNumber中选择NUM;
按PROPCODE(导入连接)从属性顺序中选择PROPCODE
{
importConnection.Open();
DataTable sysNum=新DataTable();
DataTable props=新的DataData();
Console.WriteLine(“Visual Foxpro连接打开”);
var exportReader=CodeChange.ExecuteReader();
sysNum.Load(exportReader);
exportReader.NextResult();
道具加载(exportReader);
对于(int x=0;x
这两个表之间的关系是什么?属性表中的每条记录都有SystemNumber中的记录吗?Joshua,你需要更好地解释一下,你想要实现什么。通过检查代码几乎不可能理解它。您可以连接两个表,即使它们没有任何关系,但我认为这不是您的意思。相反,您可以将数据获取到本地,并使用它们的行位置“连接”(.Zip)它们(您可以通过使用VFP的recno()函数来实现这一点,只有在单个表上使用时才可以信任该函数,但最好不要信任它)。如果您能对您的数据进行采样,并了解您想要实现的目标,我们将提供更好的帮助。注释不允许写入更多内容:(抱歉。本质上,有两个VFP表已经填充了数据;它们是属性表和客户端表。每个表中都有一列我要更新:property中的PROPCODE和client中的PROPCODET,这两列连接了我需要将这两个记录更新为新值的两个表“Propcode2"在代码中定义。SYSTEMNUMBERS对此并不重要,因为我可以在必要时手动定义。但这仍然不够解释,请检查代码,还存在数据类型不兼容的问题。我担心您需要将表作为列表和所需结果进行采样。否则,每个表只需一个更新命令即可d do.Steve,你的代码不能与VFP一起使用,分号是一个命令延续字符,VFP不会理解你的意思。它也不支持多个结果集。而且它还不清楚,如果他甚至需要进行选择的话。@CetinBasoz这里肯定有很多混乱……我将等待OP的明确解释