Я пытаюсь сделать массовую вставку в db2 с помощью С#.
CREATE TABLE tsdta.ftestbk1
(
NUM numeric(8,0),
TEXT varchar(30)
)
И вот мой тестовый код:
using IBM.Data.DB2.iSeries;
...
using (iDB2Connection connection = new iDB2Connection("xxx"))
{
string sql = @"insert into tsdta.ftestbk1
values
(
@num,
@text
)";
connection.Open();
iDB2Command command = connection.CreateCommand();
command.CommandType = CommandType.Text;
command.CommandText = sql;
command.Prepare();
command.DeriveParameters();
for (int i = 0; i < 5; i++)
{
command.Parameters.Add("@num", i);
command.Parameters.Add("@text", $"some text for {i}");
command.AddBatch();
}
int rows = command.ExecuteNonQuery();
connection.Close();
}
Когда я выполняю код, в таблице только значения NULL.
NUM | TEXT
------------
<null> |<null>
<null> |<null>
<null> |<null>
<null> |<null>
<null> |<null>
Может ли кто-нибудь сказать мне, что я делаю неправильно?





Без экземпляра Db2 для двойной проверки я делаю это из памяти и некоторого старого кода, но у меня есть следующее, которое работает в нашей рабочей среде для меня (я настроил его, чтобы он выглядел как ваш)
using (iDB2Connection connection = new iDB2Connection("xxx"))
{
iDB2Command command = new iDB2Command("INSERT INTO TSDTA.FTESTBK1 VALUES(@NUM, @TEXT", connection);
// Initialize the parameters collection
command.DeriveParameters();
for (int i = 0; i < 5; i++)
{
command.Parameters["@NUM"].Value = i;
command.Parameters["@TEXT"].Value = $"some text {i}";
command.AddBatch();
}
command.ExecuteNonQuery();
}
В то время у нас была похожая проблема, и я получил исходный код отсюда...
C# — вставка нескольких записей одновременно в AS400
Спасибо за это. Я изменил доступ к параметру в цикле for, но у меня странное поведение. Здесь я получаю исключение ArgumentOutOfRangeException: command.Parameters["@TEXT"].Value = $"some text {i}". После отладки параметров команды я обнаружил, что метод DeriveParameters() подготавливает ParameterName "@TEXT\r\n" из sql-строки. После изменения sql-строки как в вашем примере все работает. Так. Никогда не форматируйте sql-строку, как я сделал в своем примере :-)