Как вставить ac # datetime var в SQL Server - PullRequest
2 голосов
/ 23 мая 2011

Вот код:

string ConnectionString= @"Data Source=localhost\SQLEXPRESS; 
Initial Catalog=notepad; Integrated Security=SSPI ";
SqlConnection con = new SqlConnection(ConnectionString); 
con.Open();
string strEvent = TextBoxEvent.Text;
string strDate = Calendar1.TodaysDate.ToShortDateString();
string strInsert = "insert into notepad (time, event) values (strDate, strEvent )";
SqlCommand cmd=new SqlCommand(strInsert, con);
cmd.ExecuteNonQuery();

время smalldatetime в SQL Server 2005

Когда я запускаю эту программу, возникает ошибка, подобная этой:

Имя "strDate" не разрешено в этом контексте.Допустимые выражения - это константы, константные выражения и (в некоторых контекстах) переменные.Имена столбцов недопустимы.

, но если я заменю strDate на 2010/05/22 следующим образом:

string strInsert = "insert into notepad (time, event) values ("2010/05/22", strEvent )";

, программа будет работать правильно.

Я озадачен этой проблемой и обращаюсь за помощью к вам.

Ответы [ 3 ]

5 голосов
/ 23 мая 2011

Вы должны использовать параметризованные запросы для вставки данных в SQL Server, и вы должны поместить свои SqlConnection и SqlCommand в блоки использования - попробуйте что-то вроде этого:

string ConnectionString= @"Data Source=localhost\SQLEXPRESS; 
Initial Catalog=notepad; Integrated Security=SSPI ";

string sqlStatement = "INSERT INTO dbo.Notepad(time, event) VALUES (@Date, @Event)";

using(SqlConnection con = new SqlConnection(ConnectionString))
using(SqlCommand cmd = new SqlCommand(sqlStatement, con))
{
   cmd.Parameters.Add("@Date", SqlDbType.DateTime).Value = Calendar1.TodaysDate;
   cmd.Parameters.Add("@Event", SqlDbType.VarChar, 100).Value = TextBoxEvent.Text.Trim();

   con.Open();
   cmd.ExecuteNonQuery();
   con.Close();
}

Кроме того, это смешивает код доступа к вашей базе данных с вашим кодом пользовательского интерфейса (получение данных из текстового поля и элемента управления календаря) - это плохая практика - вы должны разделить это на два этапа:

  1. получить текущие значения из пользовательского интерфейса в файле с выделенным кодом
  2. передает их на уровень данных, который обрабатывает доступ к данным, не затрагивая непосредственно элементы управления пользовательским интерфейсом
2 голосов
/ 23 мая 2011

Все перечисленные методы хороши, но я предпочитаю следующий, потому что он имеет преимущество перед другими

DataAccess DAB = new DataAccess();
ArrayList arrList = new ArrayList();
string SQL = " insert into notepad (time, event) values (?,?) ";
arrList.Add(new DataAccessBlock.DataAccess.Parameter("@time",  DbType.DateTime, 30, ParameterDirection.Input, "", strDate ));    
arrList.Add(new DataAccessBlock.DataAccess.Parameter("@event", DbType.String, 50, ParameterDirection.Input, "", strEvent ));

DAB.ExecuteScalar(SQL, CommandType.Text, arrList);
1 голос
/ 23 мая 2011

Это утверждение ниже неверно, потому что вы фактически используете strDate вместо того, чтобы подставлять его значение.

string strInsert = "insert into notepad (time, event) values (strDate, strEvent )";

Вам нужно написать следующее:

string strInsert = "insert into notepad (time, event) values ("+strDate+"," +strEvent+)";

Это заменит strDate и strEvent фактическими значениями во время выполнения.

* Однако этот подход НЕ рекомендуется, поскольку он подвержен атакам внедрения SQL *

...