ibrahim maher Ответов: 1

Ref или out как установить его в качестве объекта


У меня есть способ Тада заполнения данных в сетку и вернуть данные касательно объекта адаптера может мне обновить данные в таблице после обновления строки ...
и я нашел способ передать переменную адаптера данных OLEDB или SQLDB
но когда я использую ref или Out to Data Adapter появляется ошибка

Что я уже пробовал:

это код из метода
enum ConnectionType
  {
      SQL,
      OLEDB
  }


public void Grid(ConnectionType ADOType, GridControl obj, object cn, DataSet DS, ref object DA, ref DataTable DT, String DataTableName, string sqlString, params object[] Parameter) 
        {

            if (ADOType == ConnectionType.OLEDB)
            {
                DataManagerOLEDB DM_ = new DataManagerOLEDB();
                OleDbDataAdapter da =  (OleDbDataAdapter)DA; 
                DM_.SelectFromTable((OleDbConnection)cn, sqlString, DS, out da, 
                DataTableName, Parameter);
            }
            else
            {
                DataManagerSQL DM_ = new DataManagerSQL();
                SqlDataAdapter da = (SqlDataAdapter)DA;

                DM_.SelectFromTable((SqlConnection)cn, sqlString, DS, out da, 
                DataTableName, Parameter);
            }
            
            DT = DS.Tables[DataTableName];
            obj.DataSource = DT;


когда проходит такой метод, как этот

<pre>SurveyVar.fillDxControl.Grid(ConnectionType.OLEDB, grdSurvey, SurveyVar.cnSurvey, SurveyVar.DataSetSurvey, ref SurveyVar.DataAdapterSurvey,  ref datSurvey, "T002", sqlString, vParameters);               



Ошибка появляется в переменной адаптера данных как "
Severity	Code	Description	Project	File	Line	Suppression State
Error	CS1503	Argument 5: cannot convert from 'ref System.Data.OleDb.OleDbDataAdapter' to 'ref object'	Survey	F:\BannaSQLSource\_New Application\Source Code\SurveyApplication\Application Caption\forms\frmSurvey.cs	125	Active

1 Ответов

Рейтинг:
12

OriginalGriff

Давайте немного упростим это:

private void MyMethod(ref object o)
    {
    }
private void MyButton_Click(object sender, EventArgs ew)
    {
    OleDbDataAdapter da = new OleDbDataAdapter();
    MyMethod(ref da);
...
Почему вы получаете сообщение об ошибке сказав:
cannot convert from 'ref System.Data.OleDb.OleDbDataAdapter' to 'ref object'
Подумайте об этом: o-это ссылка на объект, поэтому вы можете очень законно поместить в него любой тип значения внутри метода:
private void MyMethod(ref object o)
    {
    o = "hello";
    }
Если бы система позволила вам это сделать, какой эффект это дало бы?

Неприятно, вот что. Потому что o это ref, любые изменения в нем отражаются в вызывающих метод параметрах переменных -= в этом случае, da получает набор в строку. Поэтому, когда управление возвращается к событию нажатия кнопки и код пытается использовать данные в DataAdapter, он находит строку, и все начинает падать.

В результате вы не можете привести параметр ref - тип должен точно соответствовать.
Если вам нужно передать различные типы объектов в качестве параметров ref, то вместо этого рассмотрите возможность использования дженериков.