#c# #oracle #visual-studio #oledb
Вопрос:
Я пытаюсь обновить записи с помощью OleDbConnection. Данные, которые я хотел обновить, в массиве байтов, будут храниться в виде большого двоичного объекта в oracle. Однако, когда строка попадает в ExecuteNonQuery
, ничего не меняется
Что я пробовал:
Я думал, что была проблема с самим запросом. Поэтому я попробовал следующее:
1: Проверьте с помощью другого запроса:
@"UPDATE dcmnts
SET TestCol = ?
where BUSNSS_ID = ?";
Запустив это, программа TestCol
была успешно обновлена. Это столбец varchar
2: Убедился, что привязка в том же порядке отображается в запросе, что и вопросительные знаки, тоже не сработало
3: Поставьте a Console.WriteLine
в конце, и он предложит: «1 строка с обновлением 12345678», поэтому он обновляется, но когда я проверяю разработчика Oracle, Summary_SPOD
столбец по-прежнему равен нулю
public void SaveSPODLetter(byte[] Letter, string TrackingNumber )
{
string query = @"UPDATE dcmnts
SET SUMMARY_SPOD = ?
where BUSNSS_ID = ?";
OleDbCommand command = null;
string ConnString = ConfigurationManager.ConnectionStrings["My_db"].ToString();
using (OleDbConnection connection = new OleDbConnection(BaseEncryptor.DecryptString(ConnString)))
{
try
{
if (connection.State != ConnectionState.Open)
connection.Open();
command = new OleDbCommand(query, connection);
command.Parameters.Add(new OleDbParameter("SUMMARY_SPOD", Letter));
command.Parameters.Add(new OleDbParameter("BUSNSS_ID", TrackingNumber));
int rowUpdate = command.ExecuteNonQuery();
Console.WriteLine($"{rowUpdate} row with {TrackingNumber} updated");
}
finally
{
if (command != null) { command.Dispose(); command = null; }
}
}
}
Я не уверен, почему он все еще показывает ошибку, связано ли это с тем фактом, что Letter
это массив байтов?
Комментарии:
1. пробовать
command.Parameters.Add("Letter", OleDbType.VarBinary).Value = Letter;
2. @Иззи то же самое, к сожалению
Ответ №1:
Я не уверен, считается ли это решением, но, похоже, это связано с OleDB.
Я так и не понял, почему, поэтому переключился Oracle.DataAccess.Client
и соответствующим образом изменил все функции. После этого это сработало.
public void SaveSPODLetter(byte[] Letter, string TrackingNumber )
{
string query = @"UPDATE dcmnts
SET SUMMARY_SPOD = :Summary_SPOD
where BUSNSS_ID = :BUSNSS_ID";
OracleCommand command = null;
string ConnString = ConfigurationManager.ConnectionStrings["My_db"].ToString();
using (OracleConnection connection = new OracleConnection(BaseEncryptor.DecryptString(ConnString)))
{
try
{
if (connection.State != ConnectionState.Open)
connection.Open();
command = new OracleCommand(query, connection);
command.Parameters.Add(new OracleParameter("Summary_SPOD", Letter));
command.Parameters.Add(new OracleParameter("BUSNSS_ID", TrackingNumber));
command.ExecuteNonQuery();
//Console.WriteLine($"{rowUpdate} row with {TrackingNumber} updated");
}
finally
{
if (command != null) { command.Dispose(); command = null; }
}
}
}