UWP 应用程序 - 将 SQL 表中的数据显示到数据网格或列表框

Posted

技术标签:

【中文标题】UWP 应用程序 - 将 SQL 表中的数据显示到数据网格或列表框【英文标题】:UWP Application - Displaying data from SQL table onto Data Grid or Listbox 【发布时间】:2021-09-30 04:06:21 【问题描述】:

我在将数据显示到数据网格甚至包含 SQL Server 表数据的列表框中时遇到了一些问题。 我能够使用 Windows 窗体应用程序而不是 UWP 在 DataGridView 中显示加载数据。如果这有什么不同,我将使用我在表单应用程序中使用的相同连接字符串。

在 Mainpage.xaml 我有这样的数据网格:

<Custom:DataGrid x:Name="dataGridView1" ItemsSource="Binding"/> 
 <ListBox x:Name="lbData" ItemsSource="Binding" Margin="803,428,386,434"/>

在 .cs 页面中:

 SqlConnection conn = new SqlConnection();
    conn.ConnectionString = "Server=(local);Database=databaseName;" + "User=someuser; Password=somepassword";
    
SqlCommand cmd = conn.CreateCommand();

string query = "Select * FROM TABLE_NAME";
                cmd.CommandText = query;
                conn.Open();

                SqlDataReader reader = cmd.ExecuteReader();
                reader.Read();

                DataTable dt = new DataTable();
                dt.Load(reader);



                dataGridView1.ItemsSource = dt.DefaultView;
                lbData.ItemsSource = dt.DefaultView;
                dataGridView1.AutoGenerateColumns = true;

                reader.Close();

                cmd.Dispose();
                conn.Close();

我读到将 itemSource 添加到网格视图时需要 DefaultView。 而不是在页面加载下,我还在按钮单击下实现了此代码以查看是否会显示任何数据,但我得到:System.Data.SqlClient.SqlException:'建立连接时发生与网络相关或特定于实例的错误到 SQL Server。服务器未找到或无法访问错误。

想知道什么是解决此问题的最佳方法,以及如何显示我的 SQL Server 表中的信息。谢谢。

【问题讨论】:

【参考方案1】:

要从SQL Server数据库中检索数据并在DataGrid中显示,首先需要创建一个类,其属性对应数据表的列名,然后使用SqlDataReader.Read()方法读取每一行的数据并转换每个记录到一个类对象,最后将它们写入一个集合。请参考以下代码。

  public sealed partial class MainPage : Page
    
        public ObservableCollection<DataInfo> results;
        public MainPage()
        
            this.InitializeComponent();
        

        private void Page_Loaded(object sender, RoutedEventArgs e)
        
            results = new ObservableCollection<DataInfo>();
            string ConnectionString = "Data Source =xx;Initial Catalog =xx;User ID=xx;Password=xx";
            string query = "Select * FROM timedemo1";
            try
            
                using(SqlConnection conn=new SqlConnection(ConnectionString))
                
                    conn.Open();
                    if (conn.State == ConnectionState.Open)
                    
                        using(SqlCommand cmd = conn.CreateCommand())
                        
                            cmd.CommandText = query;
                            using (SqlDataReader reader = cmd.ExecuteReader())
                            

                                while (reader.Read())
                                
                                    DataInfo data = new DataInfo();
                                    data.name = reader.GetString(0);  //first column datatype:(nchar(10))
                                    data.time = reader.GetDateTime(1); //second column datatype:(date)
                                    results.Add(data);
                                
                            
                        
                    
                
            
            catch (Exception ex)
            
                Debug.WriteLine("Exception:"+ ex.Message);
                       
          myDataGrid.ItemsSource =results;       
          myDataGrid.AutoGenerateColumns = true;    
        
      
    

    public class DataInfo
    
        public string name  get; set; 
        public DateTime time  get; set; 

更多信息可以在这里找到。Retrieve products from the SQL Server database

【讨论】:

感谢您对此进行调查,终于有时间尝试进行故障排除。我尝试采纳您的建议,并查看了 Microsoft 文档。当我运行应用程序时,只有表格的标题显示在 DataGrid 中,但没有数据行。我不太清楚为什么会这样。 我尝试再次重新创建应用程序,但只有我的 SQL 表的标题显示没有数据显示。看起来它只是根据我的 DataInfo 类方法(字符串、日期时间)填充标题。 100% 确定我也有数据行。 数据绑定的过程好像有问题。你需要注意我在 SQL 数据库中有一个表,它有两列名为 NameTime,它们的类型是(nchar(10))Date。因此,我创建了一个 DataInfo 类,其中有两个指定的属性与表对应,并使用reader.GetString(0)reader.GetDateTime(1) 来获取第一、第二列数据。这意味着如果表中有 Int32 类型的列,则需要使用 reader.GetInt32(ColumnIndex) 获取数据并在 DataInfo 类中添加具有 Int 类型的属性。跨度> 关键是创建一个正确的类对应表,并使用合适的SqlDataReader方法获取每一列的数据。如果您按照上述操作,那么您可以检查 results 集合是否有数据。 我在控制台应用程序上使用相同的连接详细信息,但对于 UWP,我收到了这些错误。这是我在调试控制台上得到的: 异常抛出:System.Data.SqlClient.dll 中的“System.Data.SqlClient.SqlException”异常:建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:TCP 提供者,错误:40 - 无法打开与 SQL Server 的连接)

以上是关于UWP 应用程序 - 将 SQL 表中的数据显示到数据网格或列表框的主要内容,如果未能解决你的问题,请参考以下文章

将 SQL 数据库中的数据显示到 php/html 表中

如何将表单中的文本添加到sql表中?

将 SQL 表中的所有数据提取到我的 Python 代码中

从api获取图像作为字符串?到 UWP 应用程序

将数据行从 C# 中的另一个 sql 表插入到 sql 表中

怎样一个表中的2个查询结果合并到一个表中的两列