0

アプリケーションの 2 つの異なるラベルに複数の値を返す SELECT ステートメントを実行できるようにする方法に取り組んでいます。

アイデアは、選択したDBで選択を実行することにより、データベースからいくつかのバージョン情報を取得できるようにすることです。コードは機能しますが、それが非常にずさんであり、クリーンアップする方法が本当にわかりません。私がここで行っていることよりも良い方法がなければならないことはわかっています。

// 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以外のものにはかなり慣れていません。

これが重複した質問である場合は、お詫び申し上げます。

4

3 に答える 3

1

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
    }
}
于 2013-10-31T22:13:56.823 に答える
0

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 クラス ドキュメントには、多くの例があります。

于 2013-10-31T22:09:15.693 に答える
0

将来誰かがこれについて助けを必要とする場合に備えて、私が思いついた答えは次のとおりです。

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#

うまくいけば、同様の問題を抱えている人は、これから何らかの助けを得ることができます.

于 2013-11-01T17:37:43.210 に答える