我已經閱讀了本論壇提供的許多關于這個問題的問題和答案,應用了許多不同的方法并多次更改我的代碼,我什至不記得原來的了。
我不斷收到此錯誤,在以下行:
SqlDataReader dr;
錯誤是
System.Data.SqlClient.SqlException: '';' 附近的語法不正確。
我在這方面完全是個菜鳥,我是自學的,所以我很抱歉。
這是在 App.Config
<connectionStrings>
<add name="ConnectionString" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;Initial Catalog=SolAquaMasterDdata;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
我在主表單上的代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
namespace SolTry
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
SqlConnection conn = new SqlConnection();
SqlCommand cmd = new SqlCommand();
public MainWindow()
{
InitializeComponent();
conn.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString.ToString();
}
private void BtnLogin_Click(object sender, RoutedEventArgs e)
{
string User = txtUsername.Text;
string Pass = txtPassword.Password;
string str1 = "Please enter a valid Username and Password.";
string str2 = "The credentials entered do not match any registed users.";
string str3 = "These login credentials are correct.";
conn.Open();
cmd.Connection = conn;
SqlDataReader dr;
cmd.CommandText = ("SELECT Status, UserName, Password FROM tblUsers WHERE(UserName = txt.Username and Password = txt.Password;");
using (conn)
{
dr = cmd.ExecuteReader();
if ((string.IsNullOrEmpty(User)) && (string.IsNullOrEmpty(Pass)))
{
MessageBox.Show(str1, "NO CREDENTIALS ENTERED", MessageBoxButton.OK, MessageBoxImage.Error);
}
if ((string.IsNullOrEmpty(User)) == false && (string.IsNullOrEmpty(Pass)) == false)
{
if (dr.HasRows.Equals(true))
{
MessageBox.Show(str3, "LOGIN SUCCESSFUL", MessageBoxButton.OK, MessageBoxImage.Information);
}
else if (dr.HasRows == false)
{
MessageBox.Show(str2, "INVALID CREDENTIALS", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
}
conn.Close();
}
private void ExitApp(object sender, RoutedEventArgs e)
{
Application.Current.Shutdown();
}
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonDown(e);
DragMove();
}
}
}
無論我嘗試過什么,我總是失敗。
我想要做的就是點擊登錄表單按鈕驗證 tblUsers 中的用戶名和密碼是否正確,然后檢查狀態是否為“true”或 1
請告訴我如何引數化sql
uj5u.com熱心網友回復:
這行代碼在參考的查詢文本中的括號不匹配。
cmd.CommandText = ("SELECT Status, UserName, Password FROM tblUsers WHERE(UserName = txt.Username and Password = txt.Password;");
WHERE 后面有一個左括號,參考的文本中沒有右括號。這就是您收到 SQL 例外的原因。您可以洗掉左括號,也可以添加右括號。
此外,您需要使用引數來傳遞用戶名和密碼值。字串txt.Username和txt.Password對 SQL 服務器沒有任何意義。
uj5u.com熱心網友回復:
您現有的代碼存在許多問題。
- 首先,您試圖從 SQL 中參考 C# 物件。您不能這樣做,因為服務器根本看不到您的客戶端代碼。而是使用適當的引數化。
- 你有一個缺失/額外的括號
- 您需要在使用時創建和處置帶有
using塊的連接、命令和閱讀器物件。然后您不需要明確關閉,using它會為您關閉它。 - 連接打開時不要用訊息框阻塞執行緒
- 實際上沒有必要使用閱讀器,因為您只想檢查單行是否存在。只是
SELECT 1和使用cmd.ExecuteScalar() - 不要存盤或傳遞純文本密碼。在客戶端對密碼進行散列,并將散列傳遞給服務器進行檢查。
if ((string.IsNullOrEmpty(User)) && (string.IsNullOrEmpty(Pass)))
{
MessageBox.Show(str1, "NO CREDENTIALS ENTERED", MessageBoxButton.OK, MessageBoxImage.Error);
return;
}
bool isMatch;
const string query = @"
SELECT 1
FROM tblUsers u
WHERE u.UserName = @Username
and u.PasswordHash = @PasswordHash;
";
using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString.ToString()))
using (var cmd = new SqlCommand(query, conn))
{
cmd.Parameters.Add("@UserName", SqlDbType.NVarchar, 250).Value = txt.Username;
cmd.Parameters.Add("@PasswordHash", SqlDbType.Binary, 32).Value = YourPasswordHashFunctionHere(txt.Password);
conn.Open();
isMatch = ((int?)cmd.ExecuteScalar()) == 1;
}
if (isMatch)
{
MessageBox.Show(str3, "LOGIN SUCCESSFUL", MessageBoxButton.OK, MessageBoxImage.Information);
}
else
{
MessageBox.Show(str2, "INVALID CREDENTIALS", MessageBoxButton.OK, MessageBoxImage.Error);
}
uj5u.com熱心網友回復:
您沒有向命令發送任何引數。引數化您的查詢,sql 將起作用
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/376744.html
標籤:C# sql-server 视觉工作室
下一篇:C#將SQL輸出顯示到文本框中
