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

时间:2014-04-03 14:05:44

标签: c# sql .net ado.net dataset

我正在研究我的学校项目。我使用visual studio's 'Data Set Configuration Wizard'生成了SQL Server Compact版数据库的数据集。

我有一个名为'User'的表。我想用“数据集”的“用户”表填充仅包含符合特定条件的记录。但当我调用'adapter.Fill(ds.User)'时,它会用数据库表中的所有数据填充表。

我试图将适配器的'SELECT'命令设置为

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

但这也行不通。谁能告诉我如何在'adapter'的'SELECT'命令中指定'WHERE'子句?

这是图像 http://s3.postimg.org/4pqb9cwyr/error.png

这里的代码也是

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);
        }
    }
}

3 个答案:

答案 0 :(得分:1)

当调用SelectCommand方法时,类型化数据适配器确实只会初始化Fill。所以不幸的是,你很难用你的方式设置你想要的查询。我建议您退出使用向导并掌握机制,但这超出了您的问题范围。不过,this link应该是有意义的。

除此之外,您查询的实际格式是错误的。如果UserNamevarchar,则您的比较将会出现围绕您的用户名值的撇号(')。您还必须确保您的值将使它本身可能包含的任何撇号加倍,以便Sql Server将它们解释为char而不是分隔符。

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

或者更好的是,使用参数来保护您的代码免受SQL injection attack

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

答案 1 :(得分:1)

尝试

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

您实际上忘记在用户名

周围添加冒号' '

答案 2 :(得分:1)

您必须在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注入做一些研究以了解原因。