2014-03-27 32 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:补充说明。 –