我有简单的应用程序来建立sql查询(教育目的)。 我创建了textarea,用户可以将他的命令写入sql,然后程序必须执行它或捕获Sqlexeption。我知道安全等,但其确定用户可以删除所有内容:)SQL C#,命令(查询)正在执行两次
好的。这里是代码:
查询=文本从文本区域(其SQL命令)
if (!String.IsNullOrEmpty(query) || !String.IsNullOrWhiteSpace(query))
{
string conString = ConfigurationManager.ConnectionStrings["StudentDataBase"].ConnectionString;
try
{
using (SqlConnection SqlCon = new SqlConnection(conString))
{
try
{
SqlCommand command = new SqlCommand(query, SqlCon);
SqlCon.Open();
command.ExecuteScalar();
int numOfRows = 0;
SqlDataAdapter adpt = new SqlDataAdapter(command);
DataTable dt = new DataTable();
DataSet dset = new DataSet();
adpt.Fill(dset);
dt = dset.Tables[0];
if (dt.Rows.Count > 0)
{
numOfRows = dt.Rows.Count;
gridview_results.DataSource = dt;
gridview_results.DataBind();
Sql_error = "Done. Results: " + numOfRows + " rows.";
container_sql_error.Style.Add("background-color", "#b9ffcb");
}
else
{
Sql_error = "0 rows to show.";
}
SqlCon.Close();
}
catch (SqlException ex)
{
Sql_error = "Error: " + ex.Message;
container_sql_error.Style.Add("background-color", "#ff9600");
}
}
}
catch (SqlException ex)
{
Sql_error = "Error... " + ex.Message;
container_sql_error.Style.Add("background-color", "#ff9600");
}
}
而现在,当我尝试:
SELECT * FROM test
其确定。 GridView显示数据。
slleeeccct * from testsste
其确定 - 显示错误。
INSERT INTO test (col1) VALUES ('aaa')
其不正确 - 程序抛出错误System.IndexOutOfRangeException: cannot find table 0
但是命令正确地执行了但是两次。
现在我有一个问题:为什么命令执行TWICE(在数据库中有两个相同的数据),为什么会出现一个关于finding table 0
的错误(关于GridView可能无法填充GV insert into
)?
那么你打电话'SqlCommand.ExecuteScalar'然后你使用相同的命令与之前阅读一个'SqlDataAdapter'并要求该适配器填充数据集。 ..它将会再次执行命令。你为什么要调用'ExecuteScalar'呢? –
那么,要执行命令:),那么我应该怎么打电话? – Kafus
@Kafus,我想乔恩暗示对'ExecuteScalar'的调用可能是虚假的,可能会被安全地删除。 (正如他所说的那样,'SqlDataAdapter'将自己执行命令) –