2016-11-14 55 views
0

我有简单的应用程序来建立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)?

+1

那么你打电话'SqlCommand.ExecuteScalar'然后你使用相同的命令与之前阅读一个'SqlDataAdapter'并要求该适配器填充数据集。 ..它将会再次执行命令。你为什么要调用'ExecuteScalar'呢? –

+0

那么,要执行命令:),那么我应该怎么打电话? – Kafus

+1

@Kafus,我想乔恩暗示对'ExecuteScalar'的调用可能是虚假的,可能会被安全地删除。 (正如他所说的那样,'SqlDataAdapter'将自己执行命令) –

回答

1

首先,您要执行的代码两次

- >一个你正在使用的ExecuteScalar和你使用的是SQLAdapter,以填补与返回的结果集的其它时间,你可以只使用它像下面:

1- dataset ds=new dataset(); 

2- adapter.fill(ds); 

3- return ds; 

,仅此而已:)

关于的樱雪rt查询错误,这也是正常的,因为使用Execute Scalar的插入语句将执行查询,并返回查询返回的结果集中第一行的第一列。其他列或行将被忽略。

所以,当您使用Insert语句,你是因为无论

1-命令未成功执行并返回一个错误“检查databsae已插入的行刚才键入”

有错误

2 - 数据集表中没有数据,就可以让一个if语句检查您尝试从它像

"If(ds.tables.count>0) {do something}" 
+0

谢谢。这正是我需要的。 – Kafus