我正在研究我的学校项目。我使用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);
}
}
}
答案 0 :(得分:1)
当调用SelectCommand
方法时,类型化数据适配器确实只会初始化Fill
。所以不幸的是,你很难用你的方式设置你想要的查询。我建议您退出使用向导并掌握ado.net机制,但这超出了您的问题范围。不过,this link应该是有意义的。
除此之外,您查询的实际格式是错误的。如果UserName
为varchar
,则您的比较将会出现围绕您的用户名值的撇号('
)。您还必须确保您的值将使它本身可能包含的任何撇号加倍,以便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注入做一些研究以了解原因。