[英]Execute Select with more than one column and assign to Labels
我正在研究一种能够运行SELECT语句的方法,该SELECT语句将一个以上的值返回到应用程序的两个不同标签中。
这个想法是通过在选择的数据库上运行一个select能够从数据库中获取一些版本信息,我得到了可以工作的代码,但是我知道它非常草率,而且我不确定如何清除它。 我知道必须有一个比我在这里做的更好的方法。
// Update Version & Version2
string sqlCom1 = String.Format(@"SELECT [Version]
FROM ConfigSystem");
string sqlCom = String.Format(@"SELECT Version2
FROM ConfigSystem");
SqlConnectionStringBuilder ConnectionString = new SqlConnectionStringBuilder();
ConnectionString.DataSource = "SQL06";
ConnectionString.InitialCatalog = "SuperSweetDB";
ConnectionString.IntegratedSecurity = true;
SqlConnection cnn;
cnn = new SqlConnection(ConnectionString.ToString());
using (var version = new SqlCommand(sqlCom1, cnn))
{
cnn.Open();
label.Text = (string)version.ExecuteScalar();
cnn.Close();
};
using (var version = new SqlCommand(sqlCom, cnn))
{
cnn.Open();
label2.Text = (string)version.ExecuteScalar();
};
我想并且不确定(我不确定)我正在打开连接以获取可以轻松地通过SQL获得的数据。 它返回到列数据中的问题,我无法在Google中找到如何处理该问题的问题。 (我可能正在寻找错误的东西)
我之所以这样做,是因为我确实需要它工作,现在我正在尝试清理所有内容。
只是一个提示,对于C#或非SQL的任何东西都是相当新的。
如果有任何重复的问题,我深表歉意,我们将不胜感激。
您可以使用1个字符串变量中的分号来分隔2条SQL语句,然后在SqlDataReader上使用NextResult()方法来获取多个结果集。
我更新了您的代码以使其正常工作。 见下文。 请注意,使用using关键字会在代码执行后自动处置资源。 我使用内置在2条sql语句中的变量进行注释的SQL Server测试了代码。
您应该能够将以下代码粘贴到控制台应用程序中并成功运行。
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
namespace SqlMultipleResultsets
{
class Program
{
static void Main(string[] args)
{
SqlConnectionStringBuilder ConnectionString = new SqlConnectionStringBuilder();
ConnectionString.DataSource = "SQL06";
ConnectionString.InitialCatalog = "SuperSweetDB";
//ConnectionString.DataSource = "(localdb)\\Projects";
//ConnectionString.InitialCatalog = "tempdb";
ConnectionString.IntegratedSecurity = true;
string sqlSelect = @"SELECT [Version] FROM ConfigSystem;" +
@"SELECT Version2 FROM ConfigSystem";
// string sqlSelect = @"SELECT [Version] = @@VERSION;"
// + @"SELECT Version2 = @@LANGUAGE;" ;
int recordCount;
using (SqlConnection cnn = new SqlConnection(ConnectionString.ToString()))
{
using (SqlCommand command = new SqlCommand(sqlSelect, cnn))
{
cnn.Open( );
SqlDataReader dr = command.ExecuteReader( );
recordCount = 0;
do
{
Console.WriteLine("Result set: {0}", ++recordCount);
while (dr.Read( ))
{
Console.WriteLine("Version: {0}", dr[0]);
}
Console.WriteLine(Environment.NewLine);
}
while (dr.NextResult( ));
} // END command
} // END connection
Console.Write("Press a key to exit...");
Console.ReadKey();
} // END Main
}
}
您只能创建一次SqlCommand并重用它-您可以动态设置命令:
using (var version = new SqlCommand())
{
version.CommandType = CommandType.Text;
version.Connection = cnn;
cnn.Open();
version.CommandText = sqlCom1;
label.Text = (string)version.ExecuteScalar();
version.CommandText = sqlCom2;
label2.Text = (string)version.ExecuteScalar();
cnn.Close();
};
MSDN上官方的SqlCommand类文档中有很多示例。
这是我想出的答案,以防将来有人需要帮助:
string sqlCom = String.Format(@"SELECT [Version],version2 FROM ConfigSystem");
SqlConnectionStringBuilder ConnectionString = new SqlConnectionStringBuilder();
ConnectionString.DataSource = SQL06;
ConnectionString.InitialCatalog = "SuperSweetdb";
ConnectionString.IntegratedSecurity = true;
SqlConnection cnn = new SqlConnection(ConnectionString.ToString());
using (var version = new SqlCommand(sqlCom, cnn))
{
cnn.Open();
using(IDataReader dataReader = version.ExecuteReader())
{
while (dataReader.Read())
{
label7.Text = dataReader["Version"].ToString();
label9.Text = dataReader["VertexDataVersion"].ToString();
}
}
};
我最后要做的就是用datareader分解它。 这很难弄清,需要进行很多修补,但最终,它比我之前拥有的连接更干净。
基本上,DataReader是我想要的。
这是一些有用的链接: 在没有数据的情况下,无效的读取尝试
以及以下内容: 多个SQL查询asp.net c#
希望任何有类似问题的人都能从中得到一些帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.