Вы должны:
- избегать SQL-инъекций и не просто объединять вместе свои операторы SQL!Вместо этого используйте параметризованные запросы !
- Поместите ваши
SqlConnection
и SqlCommand
объекты в блоки - , когда вы хотите вызвать оператор
INSERT
, определенно сделайте не звоните .ExecuteReader()
на вашем SqlCommand
- используйте .ExecuteNonQuery()
вместо ...
Попробуйте что-то вроде этого:
string connStr = "Data Source=Silverage-6\\SQLSERVER2005;Initial Catalog=emp;Integrated Security=SSPI";
string queryStmt =
"INSERT INTO dbo.timeday(project, iteration, activity, description, status, hour) " +
"VALUES(@Project, @Iteration, @Activity, @Description, @Status, @Hour)";
using(SqlConnection conn = new SqlConnection())
using(SqlCommand _cmd = new SqlCommand(queryStmt, conn))
{
_cmd.Parameters.Add("@Project", SqlDbType.VarChar, 100);
_cmd.Parameters["@Project"].Value = this.name1.SelectedValue.Trim();
// add other parameters the same way....
conn.Open();
int result = _cmd.ExecuteNonQuery();
conn.Close();
}
Это было быеще лучше, если вы:
- получит строку подключения из файла конфигурации один раз, централизованно, и просто передаст ее этому методу
- будет получать значения, которые нужно установить из вашего веб-интерфейсав своем коде пользовательского интерфейса, а затем вызовите этот бизнес-метод для объекта бизнес-логики и передайте значения, которые вы определили
Прямо сейчас вы дико смешиваете код пользовательского интерфейса (извлекая значения израскрывающиеся списки и текстовые поля) с кодом базы данных / бизнес-логики - это не очень солидный дизайн .....
Обновление: если вы хотите получить значения и отобразить их, вы можете использоватькак то так:
public DataTable GetDataForProject(string projectName)
{
string connStr = "Data Source=Silverage-6\\SQLSERVER2005;Initial Catalog=emp;Integrated Security=SSPI";
string queryStmt =
"SELECT project, iteration, activity, description, status, hour " +
"FROM dbo.timeday " +
"WHERE project = @project";
DataTable resultTable = new DataTable();
using(SqlConnection conn = new SqlConnection())
using(SqlCommand _cmd = new SqlCommand(queryStmt, conn))
{
_cmd.Parameters.Add("@Project", SqlDbType.VarChar, 100);
_cmd.Parameters["@Project"].Value = projectName;
SqlDataAdapter dap = new SqlDataAdapter(_cmd);
dap.Fill(resultTable);
}
return resultTable;
}
Конечно:
- Вы можете выбрать на основе других критериев (что будет отображаться в предложении
WHERE
) - , возможно, вы хотите использовать
SqlDataReader
и считывать эти данные в объекты домена (вместо *).1046 *)
, но базовая настройка - использование определенного метода, передача критериев, чтение данных с помощью SqlConnection
и SqlCommand
при использовании блоков - останется прежней.
Получив DataTable
, вы можете связать его с сеткой просмотра ASP.NET:
DataTable projectData = GetDataForProject("MyProject");
gridView1.DataSource = projectData;
gridView1.DataBind();