При использовании OleDbDataProvider для SqlServer или Oracle вставка через SqlQuery не работает? Я понимаю, что этих серверов есть специализированные провайдеры, но всё-таки — может я что-то не так делаю?
class Program
{
static void TestInsert(string connStr)
{
using (DbManager db = new DbManager(new OleDbDataProvider(), connStr))
{
Cl cl = TypeAccessor<Cl>.CreateInstanceEx();
cl.Link_Id = -1;
cl.Custom_Field_Id = -1;
cl.Value = "";
SqlQuery<Cl> query = new SqlQuery<Cl>();
int count = query.Insert(db, cl);
}
}
}
[TableName("CUSTOM_FIELDS_STRINGS")]
public abstract class Cl
{
public abstract int Link_Id { get; set; }
public abstract int Custom_Field_Id { get; set; }
public abstract string Value { get; set; }
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1128>>
Здравствуйте, Denis K., Вы писали:
DK>При использовании OleDbDataProvider для SqlServer или Oracle вставка через SqlQuery не работает?
А как именно не работает? Говорит "Invalid username or password" или ОС падает в синий экран?
... << RSDN@Home 1.2.0 alpha 4 rev. 1120>>
Здравствуйте, Блудов Павел, Вы писали:
БП>Здравствуйте, Denis K., Вы писали:
DK>>При использовании OleDbDataProvider для SqlServer или Oracle вставка через SqlQuery не работает?
БП>А как именно не работает? Говорит "Invalid username or password" или ОС падает в синий экран?
Для оракла:
DbManager: Operation 'ExecuteNonQuery' throws exception 'BLToolkit.Data.DataException: ORA-00903: invalid table name ---> System.Data.OleDb.OleDbException: ORA-00903: invalid table name
Для SqlServer:
DbManager: Operation 'ExecuteNonQuery' throws exception 'BLToolkit.Data.DataException: Must declare the scalar variable "@Link_Id". ---> System.Data.OleDb.OleDbException: Must declare the scalar variable "@Link_Id".
... << RSDN@Home 1.2.0 alpha 4 rev. 1136>>
Здравствуйте, Denis K., Вы писали:
Нужно копать в сторону файла Source\Data\DataProvider\OleDbDataProvider.cs
Там есть метод Convert, который превращает TableName в [TableName] и paramName в @paramName.
Нужно создать свой наследник OleDbDataProvider и реализовать в нём перевод имён таблиц и параметров к виду, понятному обоим движкам.
Скорее всего, сработает самый тупой вариант:
public override object Convert(object value, ConvertType convertType)
{
if (convertType == ConvertType.ExceptionToErrorNumber)
return base.Convert(value, convertType);
// return as is.
//
return value;
}
Сразу скажу, что написать запрос, понятный и MSAccess и Oracle невозможно (кроме Select * FROM someTable) а SqlServer и Oracle худо бедно можно привести к одному знаменателю — через хранимые процедуры.
... << RSDN@Home 1.2.0 alpha 4 rev. 1120>>
Если OleDbDataProvider изменить до следующего (утащено из SybaseAdoDataProvider.cs), то, он работает с 'ORAOLEDB.ORACLE' и с 'SQLOLEDB'.
Что думают об этом разработчики BLToolkit?
using System;
using System.Data;
using System.Data.Common;
using System.Data.OleDb;
namespace BLToolkit.Data.DataProvider
{
/// <summary>
/// Implements access to the Data Provider for OLE DB.
/// </summary>
/// <remarks>
/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
/// </remarks>
/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
public class OleDbDataProvider : DataProviderBase
{
/// <summary>
/// Creates the database connection object.
/// </summary>
/// <remarks>
/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
/// </remarks>
/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
/// <returns>The database connection object.</returns>
public override IDbConnection CreateConnectionObject()
{
return new OleDbConnection();
}
/// <summary>
/// Creates the data adapter object.
/// </summary>
/// <remarks>
/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
/// </remarks>
/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
/// <returns>A data adapter object.</returns>
public override DbDataAdapter CreateDataAdapterObject()
{
return new OleDbDataAdapter();
}
/// <summary>
/// Populates the specified <see cref="IDbCommand"/> object's Parameters collection with
/// parameter information for the stored procedure specified in the <see cref="IDbCommand"/>.
/// </summary>
/// <remarks>
/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
/// </remarks>
/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
/// <param name="command">The <see cref="IDbCommand"/> referencing the stored procedure for which
/// the parameter information is to be derived. The derived parameters will be
/// populated into the Parameters of this command.</param>
public override bool DeriveParameters(IDbCommand command)
{
OleDbCommandBuilder.DeriveParameters((OleDbCommand)command);
return true;
}
public override object Convert(object value, ConvertType convertType)
{
switch (convertType)
{
case ConvertType.NameToQueryParameter:
return "?";
case ConvertType.NameToParameter:
return value;
case ConvertType.ExceptionToErrorNumber:
if (value is OleDbException)
{
OleDbException ex = (OleDbException)value;
if (ex.Errors.Count > 0)
return ex.Errors[0].NativeError;
}
break;
}
return base.Convert(value, convertType);
}
/// <summary>
/// Returns connection type.
/// </summary>
/// <remarks>
/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
/// </remarks>
/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
/// <value>An instance of the <see cref="Type"/> class.</value>
public override Type ConnectionType
{
get { return typeof(OleDbConnection); }
}
public const string NameString = "OleDb";
/// <summary>
/// Returns the data provider name.
/// </summary>
/// <remarks>
/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
/// </remarks>
/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataProvider Method</seealso>
/// <value>Data provider name.</value>
public override string Name
{
get { return NameString; }
}
}
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1138>>