2011-08-31 116 views
5
MySqlCommand cmd = new MySqlCommand 
        (@"INSERT INTO Table(field) VALUES('somevalue');" + 
        "SELECT * FROM table",cn); 

这对我来说很好,因为我只是将这些语句传递给我的MySQL服务器。使用ExecuteReader而不是ExecuteNonQuery

插入时是否可以使用ExecuteReader() &更新&删除?

我通常在那些上使用ExecuteNonQuery()

+5

希望您的真实代码在每次插入时都不会真正从表中选择所有行。这将扩大......糟糕。 –

+0

如果我尝试从整个表格中“选择”,它会真的杀死它的表现。我只是将其设置为一个示例 –

+0

[SQLCommand.ExecuteReader()可能的重复不限于只读语句](http://stackoverflow.com/questions/3348012/sqlcommand-executereader-does-not-restrict-to-只读语句) – nawfal

回答

8

你就好了捆绑额外的INSERT与您的选择具有的ExecuteReader沿()。这没关系。

我看到两件事情都可能不好啦...没有代码本身,而是你什么表现简化,并简化代码暗示一些潜在的不良行为:

第一个不行的你的代码看起来像可能正在使用字符串连接来将值替换到您的查询中。事情是这样的:

MySqlCommand cmd = new MySqlCommand 
       (@"INSERT INTO Table(field) VALUES('" + somevariable + "');" + 
       "SELECT * FROM table",cn); 

这是一个巨大的问题,因为它会打开应用程序中的一个巨大的安全漏洞。相反,你需要使用的查询参数,使代码看起来更像是这样的:

MySqlCommand cmd = new MySqlCommand 
       (@"INSERT INTO Table(field) VALUES(@somevalue);" + 
       "SELECT * FROM table",cn); 
cmd.Parameters.Add("@somevalue", SqlDbType.VarChar, 50).Value = somevariable; 

另一个潜在问题是,你的命令,更重要的是,你的连接,应被包裹在一个try/finally块(或偏好使用块),像这样:

using (var cn = new MySqlConnection("...")) 
using (var cmd = new MySqlCommand("@INSERT INTO Table(field).... ", cn)) 
{ 
    cmd.Parameters.Add(...); 
    cn.Open(); 
    using (var rdr = cmd.ExecuteReader()) 
    { 
     while (rdr.Read()) 
     { 
      //... 
     } 
    } 
} 
+0

我总是在参数上传递'user'输入以避免SQL注入并实践异常处理。我只是举一个例子来举一个例子。因为可以向我的服务器投掷批量查询。感谢启发。 –

3

的ExecuteReader

不要使用:当数据库查询是要提供确定到底是1 记录。

用途:当数据库查询将提供一组记录。它可能会搜索或报告 。

的ExecuteNonQuery

用途:当我们在谈论一个单一的数据库记录 - 在更新, 插入,删除,并通过id来获取。

的ExecuteScalar

不要使用:当数据库查询返回一个值,这个值 可以被定义为在T-SQL参数。 ExecuteNonQuery输出 在这种情况下始终首选参数,因为它更灵活,明天将有2个值,因此具有 ExecuteNonQuery我们不需要更改方法签名。

用途:当数据库查询返回单个值并且此值不能将 定义为输出参数时,由于T-SQL类型限制为 变量。

Reference

+0

OP引用MySQL的“MySqlCommand”类,而不是SQL Server。 –

+2

可疑的建议:'选择正好一个记录时使用ExecuteNon和输出参数'?等待等待。您实际上建议我们在给定的单个结果行中为每列声明* n *输出参数?残酷的维修开发商。 –

1

如果由于结构的原因,你必须使用ExecuteReader然后继续前进,只记得事后处置(关闭)的读者。它对程序有一点影响,但它很可能仅限于.Net部分,大部分仅仅是附加类实例的内存消耗。事实上,某些ADO.Net提供商在内部使用ExecuteNonQuery后面的ExecuteReader

这里更大的问题是插入查询后的SELECT * FROM table部分。即使您没有使用读取器来读取数据,它仍会消耗更多的资源来执行选择查询。在这里,无论您使用ExecuteReader还是ExecuteNonQuery(除非您从阅读器读取,当然),MySQL应该没有区别