2014-03-27 50 views
2

我試圖將信息從數據庫保存到字符串。保存sql返回字符串

下面的代碼怎麼可能?

using (SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString)) 
{ 
    SqlCommand cmd = new SqlCommand("SELECT something FROM table"); 
    cmd.CommandType = CommandType.Text; 
    cmd.Connection = connection; 
    connection.Open(); 
    cmd.ExecuteNonQuery(); 
    connection.Close(); 
} 

是否有可能使用它從string保存的數據庫中獲取一些值?

+2

你需要一個單列的價值?你需要單列的價值嗎?你的問題有點含糊 – Steve

回答

10

而不是cmd.ExecuteNonQuery(),您需要致電cmd.ExecuteScalar()

請參閱MSDN的文檔。

string result = (string)cmd.ExecuteScalar(); 

由於@ThorstenDittmar正確地指出,如果從數據庫中的值實際上是一個string(或東西,可以被映射到它,就像varchar)鑄造才起作用。

您可以使用它來確保:

object result = cmd.ExecuteScalar(); 

string s = result != null? result.ToString() : null; 

或者

string s = Convert.ToString(cmd.ExecuteScalar()); 
+2

只有當'cmd.ExecuteScalar()'返回的'object'實際*是一個字符串時,它纔有效。要將任何*對象值存儲爲字符串,您應該使用'string result = cmd.ExecuteScalar()。ToString();' –

1

您需要填寫一個SqlDatareader或一個DataSet/DataTable中使用SqlDataAdapter的記錄。目前,您正在使用通常用於INSERT/UPDATE語句的ExecuteNonQuery

DataTable dt = new DataTable(); 
using (SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString)) 
{ 
    using (SqlCommand cmd = new SqlCommand("SELECT something FROM table")) 
    { 
     cmd.CommandType = CommandType.Text; 
     cmd.Connection = connection; 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     da.Fill(dt); 
    } 
} 

這會從查詢中DataTable返回結果。

如果你想要得到的結果早在List<string>(因爲你正在請求從表中的單個列,沒準會有多行)你可以這樣做:

List<string> returnedList = new List<string>(); 
using (SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString)) 
{ 
    using (SqlCommand cmd = new SqlCommand("SELECT something FROM table")) 
    { 
     cmd.CommandType = CommandType.Text; 
     cmd.Connection = connection; 
     connection.Open(); 
     using (SqlDataReader reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       returnedList.Add(Convert.ToString(reader["something"])); 
      } 
     } 
    } 
} 

然後得到一個字符串,你可以這樣做:

string singleString = string.Join(Environment.NewLine, returnedList); 
+1

我想不出有什麼好的理由可以使用'SqlDataAdapter'或'DataTable'來讀取'string' ...實際上,我可以*幾乎不考慮任何涉及'SqlDataAdapter'或'DataTable' *的好理由*(警告:好吧,對於元編程和未知數據的非常罕見的理由) –

+0

@MarcGravell,試圖顯示返回的記錄可能是一個集合。增加了一個例子來獲得'List '。 – Habib

+0

另外我不確定OP是否真的需要從他/她的查詢中返回單個字符串。 – Habib

2

ExecuteNonQueryINSERTUPDATEDELETE語句。其他SQL命令(如DDL命令或數據庫管理命令,其中不返回結果集或結果可以被丟棄)也可以使用。

ExecuteScalar可用於SELECT語句,其中只需要第一行的第一個字段。

當必須返回更多字段和/或更多行時,請使用ExecuteReader

使用ExecuteReader的例子:

using (var conn = new SqlConnection(connectionString)) { 
    using (var cmd = new SqlCommand("SELECT name, loc FROM t WHERE [email protected]", conn)) { 
     cmd.Parameters.AddWithValue("@id", id); 
     conn.Open(); 
     using (var reader = cmd.ExecuteReader()) 
     { 
      int nameOrdinal = reader.GetOrdinal("name"); 
      int locationOrdinal = reader.GetOrdinal("loc"); 
      while (reader.Read()) { 
       Console.WriteLine("Name = {0}, Location = {1}", 
        reader.GetString(nameOrdinal), 
        reader.GetString(locationOrdinal)); 
      } 
     } 
    } 
} 
+0

那麼,你*可以使用'ExecuteNonQuery'作爲使用'return','out'或'ref'的東西,但是很明顯這樣做會很不尋常; p –

+0

@MarcGravell:補充說明。 –