#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, должен измениться или быть переименован (это может произойти), ваш код все равно компилируется / работает.