«Невозможно неявно преобразовать тип IDbConnection в SqlConnection»

#c# #sql #sql-server #unity3d

#c# #sql #sql-сервер #unity3d

Вопрос:

Мне нужна помощь, пожалуйста.

Я попытался внести INSERT в свою базу данных SQL, но не могу, потому что выдает ошибку в этой строке кода:

  commandoSQL.Connection = dbcon;
  

Я получаю эту ошибку:

Assets/NGUI/Scripts/Interaction/ChamarVariavel.cs(43,29): ошибка CS0266: не удается неявно преобразовать тип System.Data.IDbConnection' to System.Data.SqlClient.SqlConnection’. Существует явное преобразование (вам не хватает приведения?)»

Я надеюсь, что кто-нибудь сможет мне в этом помочь.

Спасибо

Мой код:

 public class ChamarVariavel : MonoBehaviour {

    public UISlider slider;

    // Use this for initialization
    void Start () {
    }

    // Update is called once per frame
    void Update () {
    }

    void OnGUI(){
        // Connection DB
        string connectionString = "Data Source=(local);Initial Catalog=Test;User ID=******;Password=*******";

        IDbConnection dbcon;

        dbcon= new SqlConnection(connectionString);

        dbcon.Open();
        //DB Online

        float x = slider.value * 100;
        GUI.Label(new Rect( 570, 238, 70, 30 ), "("   x.ToString("f2")   ")");

        string qInsert = string.Format(@"INSERT INTO Fuel (fuel) VALUES ('{0}')", x);

        SqlCommand commandoSQL = new SqlCommand(qInsert);

        commandoSQL.Connection = dbcon;

        try
        {
            commandoSQL.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            GUI.Label(new Rect( 300, 40, 300, 300 ), ex.ToString());
        }

        dbcon.Close();
        //DB offline
    }
}
  

Комментарии:

1. Ошибка не имеет ничего общего со вставкой — она связана с присвоением Connection свойства. Обратите внимание на связанные вопросы. Вы должны быть в состоянии обойтись без приведения ( commandoSQL.Connection = (SqlConnection)dbcon; ) , поскольку оно было создано как new SqlConnection(connectionString) , хотя использование более типизированной переменной ( var или SqlConnection ) позволит полностью избежать этого.

2. @user2864740 Вы в значительной степени ответили на его вопрос в комментарии. Если вы действительно ответите на него, это, возможно, даст вам очки, но также облегчит людям просмотр правильного ответа, а форматирование кода выглядит лучше и т.д. Но да, вы правы 😉

3. Я бы рекомендовал использовать метод CreateComman из IDbConnection. msdn.microsoft.com/en-us/library /…

Ответ №1:

Ошибка буквально говорит вам о проблеме, вам нужно явно привести объект, потому SqlCommand что он ищет SqlConnection , подумайте об этом:

 new SqlCommand(qInsert, (SqlConnection)dbcon);
  

и удалите эту строку:

 commandoSQL.Connection = dbcon;
  

Другой вариант — просто определить dbcon как SqlConnection :

 SqlConnection dbcon
  

и тогда вы могли бы сделать это:

 new SqlCommand(qInsert, dbcon);
  

Наконец, взгляните на сообщение в блоге, которое я написал некоторое время назад; вам нужно изменить способ использования ваших объектов.

Комментарии:

1. Спасибо, сработало отлично, решено. И, кстати, поздравляю, блог хороший, он мне нравится. Еще раз спасибо.

Ответ №2:

существует альтернативный подход, который помогает немного обобщить ваш код доступа к данным: позвольте соединению создать команду:

 using(var commandoSQL = dbcon.CreateCommand()) {
    commandoSQL.CommandText = SQL;
    //..
}
  

Из других новостей: используйте параметры, а не строку.Формат. Внедрение SQL — огромная проблема.

Ответ №3:

Ну, это сработало бы:

 commandoSQL.Connection = (SQLConnection)dbcon;
  

Because dbcon объявляется как IDbConnection, но на самом деле является SQL-соединением, но это немного глупо.

Просто сделайте

 var dbcon = new SqlConnection(connectionString);
  

и удалить

 IDbConnection dbcon;
  

и он будет объявлен как правильный тип. Я не вижу причин, по которым он должен быть объявлен как IDbConnection .

Комментарии:

1. Использование ‘var’ действительно является предпочтительным способом объявления dbcon, поскольку компилятор всегда выберет правильный тип (var не похож на старый вариант типа в VB6). Если по какой-либо причине тип, лежащий в основе SqlConnection, должен измениться или быть переименован (это может произойти), ваш код все равно компилируется / работает.