0

私はこれが簡単であることを知っていましたが、私は考えることができません。テーブルからレコードの数を表示し、テキスト ボックスに表示します。

private void gMapControl1_Load_1(object sender, EventArgs e)
{
    SqlConnection conDatabase = new SqlConnection(constring);
    conDatabase.Open();
    DataTable db = new DataTable();
    SqlDataAdapter sda = new SqlDataAdapter(
        "select count(site) from [ICPS].[dbo].[excel GPS postcode]",
        conDatabase);

    sda.Fill(db);
    textBox29.Text = ;

    SqlDataAdapter sda = new SqlDataAdapter(
        "select count(site) from [ICPS].[dbo].[excel GPS postcode] "
            + "where Region = '1'",
        conDatabase);

    sda.Fill(db);
    textBox30.Text = ;
}
4

4 に答える 4

5

次のようSqlCommand.ExecuteScalarに代わりに使用する必要があります。SqlDataAdapter

SqlCommand com = new SqlCommand("select count(site) from [ICPS].[dbo].[excel GPS postcode]", conDatabase);
object count = com.ExecuteScalar();
if(count != null) textBox29.Text = count.ToString();
//The same for textBox30

ExecuteScalarに関する詳細情報 私が投稿したコードは、 を使用するというアイデアのためだけのものであることExecuteScalarに注意code styleしてください。ADO.NETusingreusecommand, ...

于 2013-10-16T13:53:40.173 に答える
3
using (SqlConnection conn = new SqlConnection(connString))
{
   conn.Open();
   cmd.CommandText = "select count(site) from [ICPS].[dbo].[excel GPS postcode]";
   Int32 count = (Int32) cmd.ExecuteScalar();
   textBox29.Text = count.ToString();
}
于 2013-10-16T13:56:48.570 に答える
2

SQL コマンドによって返される値が 1 つだけであることを期待する場合は、コマンド オブジェクトからExecuteScalarを使用します。

string cmdText1 = "select count(site) from [ICPS].[dbo].[excel GPS postcode]";
using(SqlConnection conDatabase = new SqlConnection(constring))
using(SqlCommand cmd = new SqlCommand(cmdText, conDatabase))
{
      conDatabase.Open();
      int numRec = Convert.ToInt32(cmd.ExecuteScalar());
      textBox29.Text = numRec.ToString();
}

MSDNによると

クエリを実行し、クエリによって返された結果セットの最初の行の最初の列を返します。追加の列または行は無視されます

ただし、2 つの異なるクエリからレコード数を読み取ろうとしていることに気付きました。
したがって、データベースへのラウンドトリップを回避するために、この方法でコードを記述することもできます

string cmdText = "select count(site) from [ICPS].[dbo].[excel GPS postcode];" + 
                 "select count(site) from [ICPS].[dbo].[excel GPS postcode] " +
                 "where Region = '1'", ;
using(SqlConnection conDatabase = new SqlConnection(constring))
using(SqlCommand cmd = new SqlCommand(cmdText, conDatabase))
{
      conDatabase.Open();
      using(SqlDataReader reader = cmd.ExecuteReader())
      {
          reader.Read();
          int numRec1 = Convert.ToInt32(reader[0]);
          reader.NextResult();
          reader.Read();
          int numRec2 = Convert.ToInt32(reader[0]);
          textBox29.Text = numRec1.ToString();
          textBox30.Text = numRec2.ToString();
      }
}

このようにして、セミコロンで区切られた 2 つ以上のコマンドを実行する SQL Server の機能を利用しました。

于 2013-10-16T13:54:58.703 に答える
1

データテーブルの使用から値をフェッチするには row[columnName]

 SqlDataAdapter sda = new SqlDataAdapter(
    "select count(site) As siteCount  from [ICPS].[dbo].[excel GPS postcode]",
    conDatabase);


sda.Fill(db);
if(db !=null && db.Rows.Count > 0)
textBox29.Text =db["siteCount"].tostring();
else
textBox29.Text ="0";

ただし、King Kingがここで提案したように、1 つの行と 1 つの列だけをフェッチする必要がある場合は、なぜ datatable を使用するのか method を使用しますExecuteScalar

クエリを実行し、クエリによって返された結果セットの最初の行の最初の列を返します。追加の列または行は無視されます。-MSDN _

SqlCommand com = new SqlCommand("select count(site) from [ICPS].[dbo].[excel GPS postcode]", conDatabase);
object siteCount = com.ExecuteScalar();
if(siteCount != null) textBox29.Text = siteCount.ToString();
于 2013-10-16T14:17:53.257 に答える