C# 从c中的数据集中选择特定数据?

C# 从c中的数据集中选择特定数据?,c#,sql,.net,ado.net,dataset,C#,Sql,.net,Ado.net,Dataset,我正在做我的学校项目。我已经使用visual studio的“数据集配置向导”生成了SQL Server Compact edition数据库的数据集 我有一个名为“User”的表。我只想用那些符合特定条件的记录填充“数据集”的“用户”表。但当我调用“adapter.Fillds.User”时,它会用数据库表中的所有数据填充表 我试图将适配器的“选择”命令设置为 userAdapter.Adapter.SelectCommand.CommandText = string.Format("SELE

我正在做我的学校项目。我已经使用visual studio的“数据集配置向导”生成了SQL Server Compact edition数据库的数据集

我有一个名为“User”的表。我只想用那些符合特定条件的记录填充“数据集”的“用户”表。但当我调用“adapter.Fillds.User”时,它会用数据库表中的所有数据填充表

我试图将适配器的“选择”命令设置为

userAdapter.Adapter.SelectCommand.CommandText = string.Format("SELECT * FROM User WHERE UserName = {0}", userName);
但这也不起作用。有人能告诉我如何在“适配器”的“选择”命令中指定“WHERE”子句吗

这是图片

这是代码

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

namespace Student_s_Expense_Manager
{
    public partial class Login : Form
    {
        public Login()
        {
            InitializeComponent();
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            // Create 'User' Table Adapter
            ExpenseDataSetTableAdapters.UserTableAdapter userAdapter = new ExpenseDataSetTableAdapters.UserTableAdapter();

            // Create a Dataset of ExpenseDataSet
            ExpenseDataSet expenseDataset = new ExpenseDataSet();

            string userName = textBoxUserName.Text;

            userAdapter.Adapter.SelectCommand.CommandText = string.Format("SELECT * FROM [User] WHERE UserName = '{0}'", userName);
            userAdapter.Fill(expenseDataset.User);
        }
    }
}

类型化数据适配器实际上只在调用Fill方法时初始化其SelectCommand。因此,不幸的是,您很难按照自己的方式设置所需的查询。我建议你停止使用巫师,掌握机械,但这超出了你的问题范围。不过,这应该是一个有趣的问题

除此之外,查询的实际格式是错误的。如果UserName是varchar,您的比较将预期您的用户名值周围会出现撇号。您还必须确保您的值将其自身包含的任何撇号加倍,以便Sql Server将它们解释为字符而不是分隔符

userAdapter.Adapter.SelectCommand.CommandText =
    string.Format("SELECT * FROM User WHERE UserName = '{0}'", userName.Replace("'", "''"));
或者更好的方法是,使用一个参数来保护代码不受以下影响:

试一试


您实际上忘记了在用户名周围添加冒号“”

您必须在SQL语句中用引号括起字符串:

userAdapter.Adapter.SelectCommand.CommandText = 
    string.Format("SELECT * FROM User WHERE UserName = '{0}'", userName);
但是,您不应该在实际应用程序中这样做。对于学校项目,您可以,但您应该养成使用参数的习惯:

userAdapter.Adapter.SelectCommand.CommandText =
    string.Format("SELECT * FROM User WHERE UserName = @UserName");
userAdapter.Adapter.SelectCommand.Parameters.AddWithValue("@UserName",userName);

对SQL注入进行一些研究以了解原因。

如果我先使用adapter.Fill,然后设置CommandText,则没有任何用处,因为Fill方法将首先使用表中的所有数据填充数据集。当我尝试设置“CommandText”时,我得到的错误对象引用未设置为对象的实例。我无法从UserName=@UserName的用户跨过userAdapter.Adapter.SelectCommand.CommandText=SELECT*@ZohaibAslam刷新页面并再次阅读我的第一段:我想我必须在“设计器”生成的代码中设置“SelectCommand”。那么它应该work@ZohaibAslam您真正应该做的是停止使用向导生成的适配器。他们只是挡住了你的路。请使用类型化数据集,但删除适配器并创建自己的数据集。如果我在填充数据集之前设置CommandText,我会得到以下错误对象引用未设置为对象的实例我得到错误对象引用未设置为对象的实例,您应该向我们显示完整代码以及获取错误图像的行建立请粘贴代码。您在哪一行获得错误您的问题与您的查询无关。请参阅下面我编辑过的答案。我在[User]中的userAdapter.Adapter.SelectCommand.CommandText=string.FormatSELECT*上遇到错误,其中UserName='{0}',UserName;错误是对象引用未设置为对象的实例,我认为“适配器”在“填充”方法之前未初始化“SelectCommand”。当我们调用“Fill”方法时,它也会初始化数据集的所有“命令”
userAdapter.Adapter.SelectCommand.CommandText = 
    string.Format("SELECT * FROM User WHERE UserName = '{0}'", userName);
userAdapter.Adapter.SelectCommand.CommandText =
    string.Format("SELECT * FROM User WHERE UserName = @UserName");
userAdapter.Adapter.SelectCommand.Parameters.AddWithValue("@UserName",userName);