OleDbDataProvider и SqlServer c Oracle'ом
От: Denis K.  
Дата: 18.12.08 08:19
Оценка:
При использовании 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>>
Re: OleDbDataProvider и SqlServer c Oracle'ом
От: Блудов Павел Россия  
Дата: 24.12.08 02:49
Оценка:
Здравствуйте, Denis K., Вы писали:

DK>При использовании OleDbDataProvider для SqlServer или Oracle вставка через SqlQuery не работает?

А как именно не работает? Говорит "Invalid username or password" или ОС падает в синий экран?
... << RSDN@Home 1.2.0 alpha 4 rev. 1120>>
Re[2]: OleDbDataProvider и SqlServer c Oracle'ом
От: Denis K.  
Дата: 05.01.09 10:56
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

БП>Здравствуйте, 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>>
Re[3]: OleDbDataProvider и SqlServer c Oracle'ом
От: Блудов Павел Россия  
Дата: 10.01.09 01:29
Оценка:
Здравствуйте, 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>>
Re: OleDbDataProvider и SqlServer c Oracle'ом
От: Denis K.  
Дата: 16.03.09 13:52
Оценка:
Если 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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.