繁体   English   中英

SQL C#,命令(查询)执行两次

[英]SQL C#, command(query) is executing twice

我有一个简单的应用程序来构建sql查询(出于教育目的)。 我创建了textarea,用户可以在其中将命令写入sql,然后程序必须执行它或捕获Sqlexeption。 我知道安全性等知识,但是可以的用户可以删除所有内容:)

好。 这是代码:

查询=来自textarea的文本(其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')的NOT OK-程序抛出错误System.IndexOutOfRangeException: cannot find table 0 BUT命令被正确执行了两次。

现在我有一个问题:为什么命令执行TWICE(数据库中2x相同的数据),为什么finding table 0出错(关于GridView可能无法用insert into填充GV)?

首先,您要执行两次代码

->一次使用ExecuteScalar,另一次使用SQLAdapter用返回的结果填充数据集,则可以像下面这样使用它:

1- dataset ds=new dataset();

2- adapter.fill(ds);

3- return ds; 

就是这样:)

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

因此,当您使用Insert语句时,您会遇到错误,因为

1-命令未成功执行,并返回错误“检查databsae是否具有您刚刚键入的插入行”

2-数据集表中没有数据,您可以在尝试从中读取之前先进行IF语句检查

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM