Pra*_*tha 4 asp.net db2 odbc c#-4.0 ibm-midrange
我遇到这样的问题:
1.我使用C#ASP .Net从MySQL检索数据.- 完成 -
2.来自no.1的所有数据将被插入AS400的表中.- 我在这一步上遇到错误 -
错误消息说明了这一点ERROR [42000] [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0104 - Token ; was not valid. Valid tokens: <END-OF-STATEMENT>..确实,我使用分号将查询与其他查询分开,但这是不允许的.我谷歌搜索,但我找不到解决方案.
我的问题是<END-OF-STATEMENT>该错误信息的含义是什么?
这是我的源代码.
private static void doInsertDOCADM(MySqlConnection conn)
{
// Get Temporary table
String query = "SELECT * FROM TB_T_DOC_TEMPORARY_ADM";
DataTable dt = CSTDDBUtil.ExecuteQuery(query);
OdbcConnection as400Con = null;
as400Con = CSTDDBUtil.GetAS400Connection();
as400Con.Open();
if (dt != null && dt.Rows.Count > 0)
{
int counter = 1, maxInsertLoop = 50;
using (OdbcCommand cmd = new OdbcCommand())
{
cmd.Connection = as400Con;
foreach (DataRow dr in dt.Rows)
{
cmd.CommandText += "INSERT INTO DCDLIB.WDFDOCQ VALUES " + "(?,?,?,?);";
cmd.Parameters.Add("1", OdbcType.VarChar).Value = dr["PROD_MONTH"].ToString();
cmd.Parameters.Add("2", OdbcType.VarChar).Value = dr["NEW_MAIN_DEALER_CD"].ToString();
cmd.Parameters.Add("3", OdbcType.VarChar).Value = dr["MODEL_SERIES"].ToString();
cmd.Parameters.Add("4", OdbcType.VarChar).Value = dr["MODEL_CD"].ToString();
if (counter < maxInsertLoop)
{
counter++;
}
else
{
counter = 1;
cmd.ExecuteNonQuery();
cmd.CommandText = "";
cmd.Parameters.Clear();
}
}
if (counter > 1) cmd.ExecuteNonQuery();
}
}
Run Code Online (Sandbox Code Playgroud)
注意:我使用这种方式(首先收集一些查询,然后执行这些查询)以提高应用程序的性能.
正如Clockwork-Muse指出的那样,问题是你只能在命令中运行一个SQL语句.iSeries服务器不会立即处理多个语句.
如果iSeries服务器正在运行V6R1或更高版本,则可以使用块插入来插入多行.我不确定您是否可以通过ODBC驱动程序执行此操作,但由于您具有Client Access,因此您应该能够安装iSeries ADO.NET驱动程序.ADO.NET iSeries驱动程序和ODBC驱动程序之间没有太多区别,但使用ADO.NET可以访问iSeries特定的功能.
使用ADO.NET驱动程序,多个插入变得简单:
using (iDB2Connection connection = new iDB2Connection(".... connection string ..."))
{
// Create a new SQL command
iDB2Command command =
new iDB2Command("INSERT INTO MYLIB.MYTABLE VALUES(@COL_1, @COL_2", connection);
// Initialize the parameters collection
command.DeriveParameters();
// Insert 10 rows of data at once
for (int i = 0; i < 20; i++)
{
// Here, you set your parameters for a single row
command.Parameters["@COL_1"].Value = i;
command.Parameters["@COL_2"].Value = i + 1;
// AddBatch() tells the command you're done preparing a row
command.AddBatch();
}
// The query gets executed
command.ExecuteNonQuery();
}
}
Run Code Online (Sandbox Code Playgroud)
IBM还提供了一些使用VB6和ODBC进行块插入的参考代码,但我不确定它是否可以轻松移植到.NET:http://publib.boulder.ibm.com/infocenter/iseries/v5r4 /index.jsp?topic=%2Frzaik%2Frzaikextfetch.htm
希望有所帮助.
| 归档时间: |
|
| 查看次数: |
6595 次 |
| 最近记录: |