【问题标题】:Visual studio not loading data from Microsoft SQL Server Management StudioVisual Studio 未从 Microsoft SQL Server Management Studio 加载数据
【发布时间】:2021-03-06 13:27:19
【问题描述】:

我正在尝试从我在 SSMS 上创建的表中检索数据。我以 Visual Studio 的形式创建了一个列表框,并尝试显示数据库中的数据,但是当我尝试加载程序时它没有发送任何内容。数据库看起来不错。当我尝试检索movie_id 和movie_title 时会出现该问题。 这是我的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DataBase
{
public partial class Form1 : Form
{
    DataTable dt = new DataTable();
    public void LoadData()
    {
        SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;"+
            "Initial Catalog=online_tv;Integrated Security=SSPI;");
        SqlCommand cmd = new SqlCommand("SELECT movie.* FROM movie", conn);
        SqlDataAdapter sa = new SqlDataAdapter(cmd);
        conn.Open();
        sa.Fill(dt);
        conn.Close();
        sa.Dispose();
        cmd.Dispose();
        conn.Dispose();
    }

    public class MyMovie
    {
        public int id;
        public string title;
        public override string ToString()
        {
            return title;
        }
    }

    public void ShowMovies()
    {
        int i;
        for (i = 0; i < dt.Rows.Count; i++)
        {
            MyMovie movie = new MyMovie();
            movie.id = Convert.ToInt32(dt.Rows[i]["movie_id"]);
            movie.title = Convert.ToString(dt.Rows[i]["movie_title"]);

            listBox1.Items.Add(movie);
        }
    }

    public Form1()
    {
        InitializeComponent();
    }

    public void Form1_Load(object sender, EventArgs e)
    {
        LoadData();
        ShowMovies();
    }

【问题讨论】:

  • 您可以将整个 LoadData 方法简化为 new SqlDataAdapter("SELECT * FROM movie", @"Data Source=.\SQLEXPRESS;Initial Catalog=online_tv;Integrated Security=SSPI;").Fill(dt)。在这之后 dt 有多少行?
  • 顺便说一句,请决定表名复数策略并坚持下去。.movi​​e 是单数,users 是复数。也几乎不需要在电影的每一列前面加上“电影”——这是(应该是)表别名的用途
  • 是的,好的,知道了,但这并没有解决问题
  • 评论不是答案/“解决问题”,它们是为了要求澄清。我注意到您没有回答我在第一条评论中提出的问题
  • 我不明白你的第一个问题,行从哪里来?

标签: c# mysql visual-studio ssms


【解决方案1】:

这里有大量的优化要做,但我想发布一个答案,它引入了一个小而根本的变化,这将使您的生活变得更加轻松。几乎您在那里编写的每一行代码,都可以让 Visual Studio 为您编写;就像你在布局表单时让它编写代码一样,你也可以让它完成所有这些数据访问工作,如果你已经成功连接了 SSMS,那么连接 VS 几乎是相同的过程,并且会意味着它可以正常工作:

  • 将 DataSet 类型的文件添加到您的项目中,然后打开它
  • 右键单击它并选择添加 TableAdapter - 这就像类固醇上的 DataAdapter
  • 添加新的连接 - 该对话框实际上与 SSMS 相同,因此您应该能够轻松连接数据库
  • 假设您要编写“返回行的查询” - 将SELECT * FROM movie 放入
  • 完成向导
  • 右键单击表格适配器中的“填充”行并选择“预览数据”,点击按钮并查看您的数据。如果您没有看到任何数据,则表明您连接到的数据库没有数据
  • 转到您的表单,打开“数据源”窗口(查看菜单..其他窗口)
  • movie 节点拖出“数据源”窗口并拖到表单上
  • 运行应用程序

你会看到你的数据

现在您已经了解了这个问题的表面,您可以开始玩其他东西了。把DataTable dt扔掉;你不需要它。您的表单上有一个 dataset 对象,其中包含一个 Movie 属性,它是一个 MovieDataTable - 一个数据表的子类,您可以以比通过“字符串列名”更合乎逻辑和现代的方式访问它 - 例如,您说, yourdatasetnamehere.Movies[0].movie_title 并且它已经是一个字符串(顺便说一下,是时候将你的列名交换为 PascalCase 了)而不是 somedatatable.Rows[0]["movie_title"].ToString()

要在列表框中显示您的电影,

  • 向表单添加列表框
  • 将 DataSource 属性设置为 movieBindingSource
  • 将 DisplayMember 设置为 movie_title

(所有这些都是在表单设计器上以可视方式完成的,而不是在代码中)

你也可以考虑把 Movie POCO 扔掉;一个 MovieDataRow 由数据集生成器创建;它具有电影的所有属性,以强类型的方式,就像你的 POCO 一样。 tableadapter 下载数据库数据并将其转换为强类型的 MovieDataRow 对象,这意味着您也可以将 ShowMovies 中的所有 POCO 映射内容都扔掉,最后,数据绑定您的列表框意味着您可以丢弃构建项目集合的位置手动。

【讨论】:

  • 谢谢帮助,问题出在从设计中选择的数据和数据类型
猜你喜欢
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2012-10-02
  • 2015-04-10
  • 2023-04-07
  • 2013-09-14
相关资源
最近更新 更多