none
SQL Select功能疑問 RRS feed

  • 問題

  • 各位先進好!小弟目前正在研究 MsSQL與C#的一些指令應用,

    目前在使用Select這個語法的時候有一個疑問,

    我已經在C#程式碼下達Select的語法並且選擇p_name選項

    ,但是執行後顯示在list上卻只有第一個項目(手機),

    MsSQL資料庫內容如下:

    p_sn     p_name      p_price        p_description

    p0001   手機            10000         A

    p0002   電腦            20000         B

    P0003   耳機            3000           C

    我原本預期在List上顯示的為:

    手機

    電腦

    耳機

    想請教各位先進是否是我的Select語法有錯誤呢?感謝

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Data.SqlClient;
    
    namespace DataBase_Select
    {
        public partial class Form1 : Form
        {
            SqlConnection con = new SqlConnection(@"Persist Security Info=False;Integrated Security=true;
                Initial Catalog=TEST_DB;Server=.\SQLEXPRESS");
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                showinfo();
            }
            private void showinfo() //先載入目前商品資料表
            {
                using (SqlDataAdapter da = new SqlDataAdapter("select * from product", con)) //建立SqlDataAdapter da
                {
                    DataTable dt = new DataTable(); //建立資料物件 dt
                    da.Fill(dt); //將dt填入da
                    DataView dv = new DataView(dt); //建立dataview物件dv,並將dt寫入dv
                    this.dataGridView1.DataSource = dv; //將dv顯示於datagridview1.datasource
                }
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                con.Open();
                string sql = "SELECT* From product";
                SqlCommand cmd = new SqlCommand(sql, con);
                listBox1.Items.Add((string)cmd.ExecuteScalar());
                con.Close();
            }
        }
    }
    

    2020年2月27日 上午 06:17

解答

  • 因為你用 ExecuteScalar , 這個命令是 "執行查詢,並傳回查詢所傳回的結果集第一個資料列的第一個資料行。 會忽略其他的資料行或資料列" ,所以只會有一列。

    所以你的 listBox 的用法應該要和你寫 DataGridView 一樣,用 SqlDataAdapter,然後把結果的 DataTable 指派給 ListBox 的 DataSource 屬性 (不要再用甚麼 ListBox.Items.Add)。在這之前先設定 ListBox 的 DisplayMember 屬性就可以指定用哪個欄位當作要顯示在 ListBox 的清單中。

    ListControl.DataSource 屬性
    ListControl.DisplayMember 屬性


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/


    2020年2月28日 上午 01:47
    版主

所有回覆

  • 因為你用 ExecuteScalar , 這個命令是 "執行查詢,並傳回查詢所傳回的結果集第一個資料列的第一個資料行。 會忽略其他的資料行或資料列" ,所以只會有一列。

    所以你的 listBox 的用法應該要和你寫 DataGridView 一樣,用 SqlDataAdapter,然後把結果的 DataTable 指派給 ListBox 的 DataSource 屬性 (不要再用甚麼 ListBox.Items.Add)。在這之前先設定 ListBox 的 DisplayMember 屬性就可以指定用哪個欄位當作要顯示在 ListBox 的清單中。

    ListControl.DataSource 屬性
    ListControl.DisplayMember 屬性


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/


    2020年2月28日 上午 01:47
    版主
  • 感謝 Bill Chung先進的回覆,

    經由您的提醒後,我將程式做了些許的修改,

    即可以達到我想要的功能,再次感謝您的回覆!

    2020年3月2日 上午 05:27