2015-05-22 79 views
1

我试图从C#代码执行SQL查询,但它不返回任何值,但是当我直接向SQL中写入查询时,它工作正常。从C#代码执行SQL查询

static int TestGettingData() 
{ 
     int rows; 
     string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString; 
     using (SqlConnection connection = new SqlConnection(connectionString)) 
     { 
      using (SqlCommand command = new SqlCommand("SELECT [UserName] FROM [aspnet_Users]", connection)) 
      { 
       connection.Open(); 
       rows = command.ExecuteNonQuery(); 
      } 
     } 
     return rows; 
} 

和连接字符串:

<connectionStrings> 
<add name ="DefaultConnection" connectionString="Server=myServer; 
      Database=MyDatabase;User 
      Id=User; 
      Password=password; 
      MultipleActiveResultSets=True;" 
      providerName="System.Data.SqlClient"/> 
</connectionStrings> 

而且TestGettingData()总是返回-1。

+0

“我正在尝试执行SQL查询” - 但是您调用了'ExecuteNonQuery'。 –

回答

2

有多种方式来获取数据写出数据库

的ExecuteScalar

,如果你有一个结果字段,你可以使用

string Command = "SELECT [UserName] FROM [aspnet_Users];"; 
using (SqlConnection myConnection = new SqlConnection(ConnectionString)) 
{ 
    myConnection.Open(); 
    using (SqlCommand myCommand = new SqlCommand(Command, myConnection)) 
    { 
     string Result = (string)myCommand.ExecuteScalar(); // returns the first column of the first row 
    } 
} 

SqlDataAdapter的

如果你希望多行/列可以加载它变成一个DataTable通过

string Command = "SELECT [UserName] FROM [aspnet_Users]"; 
using (SqlConnection myConnection = new SqlConnection(ConnectionString)) 
{ 
    using (SqlDataAdapter myDataAdapter = new SqlDataAdapter(Command, myConnection)) 
    { 
     DataTable dtResult = new DataTable(); 
     myDataAdapter.Fill(dtResult); 
    } 
} 

SqlDataReader的

另一种解决方案是SqlDataReader的。例如。如果您想要将列的所有行加载到列表中。这比DataAdapter的开销少。

List<string> Result = new List<string>(); 
string Command = "SELECT [UserName] FROM [aspnet_Users];"; 
using (SqlConnection mConnection = new SqlConnection(ConnectionString)) 
{ 
    mConnection.Open(); 
    using (SqlCommand cmd = new SqlCommand(Command, mConnection)) 
    { 
     using (SqlDataReader reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       Result.Add((string)reader[0]); 
      } 
     } 
    } 
} 
+0

为什么myConnection.Open();在第二个例子中不需要? –

2

因为documentation这么说;

对于UPDATE,INSERT和DELETE语句,返回值为 受该命令影响的行数。当插入或更新的 表中存在触发器时,返回值包括受插入或更新操作影响的行的编号 以及受触发器或触发器影响的行的编号 。 对于所有其他类型的 语句,返回值为-1。如果发生回滚,则返回值 的值也是-1。

可以使用室内用COUNT(*)方法ExecuteScalar得到你的电话号码。

using (SqlCommand command = new SqlCommand("SELECT COUNT([UserName]) FROM [aspnet_Users]", connection)) 
{ 
    connection.Open(); 
    rows = (int)command.ExecuteScalar(); 
} 
0

这就是我认为是从一个数据库访问和检索数据的最佳方式:

创建的DbConnection类

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace SQLexample 
{ 
/// <summary> 
/// A class that makes the connection to the SQL Database 
/// </summary> 
class DBconnection 
{ 
    // variables 
    private string sql_string; 
    private string strCon; 
    System.Data.SqlClient.SqlDataAdapter da_1; 

    // set methods 
    public string Sql 
    { 
     set { sql_string = value; } 
    } 

    public string connection_string 
    { 
     set { strCon = value; } 
    } 

    // DataSet 
    public System.Data.DataSet GetConnection 
    { 
     get { return MyDataSet(); } 
    } 

    // MyDataSet method 
    private System.Data.DataSet MyDataSet() 
    { 
     System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(strCon); 
     con.Open(); 

     da_1 = new System.Data.SqlClient.SqlDataAdapter(sql_string, con); 

     System.Data.DataSet dat_set = new System.Data.DataSet(); 
     da_1.Fill(dat_set, "Table_Data_1"); 

     con.Close(); 

     return dat_set; 
    } 

    // Update DB method 
    public void UpdateDB(System.Data.DataSet ds) 
    { 
     System.Data.SqlClient.SqlCommandBuilder cb = new System.Data.SqlClient.SqlCommandBuilder(da_1); 
     cb.DataAdapter.Update(ds.Tables[0]); 
    } 
} 
} 

然后,从您的其他类,只要你想访问数据库你这样做:

try 
{ 
    objConnect = new DBconnection(); 
    conStringAUTH = Properties.Settings.Default.authConnectionString; 

    objConnect.connection_string = conStringAUTH; 
    objConnect.Sql = "QUERY GOES HERE"; 

    ds = objConnect.GetConnection; 

    // Data manipulation 
    maxRows = ds.Tables[0].Rows.Count; 

    if (maxRows == 0) 
    { 
     // Your query returned no values 
    } 

} 
catch (Exception err) 
{ 
    MessageBox.Show(err.Message); 
} 

希望这会有所帮助...