您應該:
- 避免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();
}
如果你這樣會更好:
- 將檢索從一個配置文件中的連接字符串一次,集中,並將其直接傳遞到這個方法
- 將檢索值從你的UI代碼的Web UI設置,然後在把這個業務方法業務邏輯對象,並通過在你確定
值現在,你瘋狂混合UI代碼與數據庫/商業邏輯代碼(從下拉菜單和文本框檢索值) - 這是不是一個非常堅固的設計.....
更新:如果你想檢索值並顯示出來,你可以使用這樣的事情:
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
和讀取數據到域對象(而不是DataTable
)
但基本設置 - 具有特定方法,通過標準,使用塊讀取SqlConnection
和SqlCommand
中的數據 - 將保持不變。
一旦你的DataTable
,您可以將其綁定到ASP.NET GridView控件:
DataTable projectData = GetDataForProject("MyProject");
gridView1.DataSource = projectData;
gridView1.DataBind();
您的代碼容易受到[SQL注入](http://xkcd.com/327/)。 – 2011-05-03 07:45:14