为什么此SQL SELECT使用有效数据时不运行?

时间:2019-03-26 13:52:54

标签: c# sql

我正在使用C#和SQL进行练习,我正在尝试制作一个简单的email + password 登录来检查数据库匹配输入。

为什么输入错误时此代码为何返回预期的0,但使用正确的数据却说输入字符串错误?

System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
cmd.CommandType = System.Data.CommandType.Text;

cmd.CommandText = 
  "SELECT UserPassword, UserMail FROM Users WHERE UserPassword = '" + 
   textBox2.Text + 
  "' AND UserMail = '" + 
    textBox1.Text + '\''; 

cmd.Connection = sqlConnection1;

sqlConnection1.Open();
int correct = 0;
correct = Convert.ToInt32(cmd.ExecuteScalar());
sqlConnection1.Close();

if(correct <= 0)
{
    MessageBox.Show("Wrong input. Correct = " + 
                     Convert.ToString(correct) + 
                    "\n" + 
                     cmd.CommandText);
}

textbox1textbox2分别是电子邮件和密码输入。

我期望“ email5” +“ email5”的输出为5,因为它是第五行(与其他有效数据相同),但是我得到了以下 exception

>
  

“ System.FormatException”类型的未处理异常发生在   mscorlib.dll

     

其他信息:输入字符串的格式不正确。

2 个答案:

答案 0 :(得分:2)

据我所知,您要检查在import React from 'react' import * as ReactDOM from 'react-dom'; import { Provider } from 'react-redux' import { ConnectedRouter } from 'connected-react-router' import store, { history } from './store' import App from './containers/app' import 'bootstrap/dist/css/bootstrap.min.css'; ReactDOM.render( <Provider store={store}> <ConnectedRouter history={history}> <div className="row"> <App /> </div> </ConnectedRouter> </Provider>, document.getElementById('root') ); 表中是否有至少条记录,其中给出了UsersUserPassword字段的值; 如果是,则用户通过UserMailtextBox2.Text提供的密码电子邮件textBox1.Text。如果是您的情况

correct

答案 1 :(得分:0)

您遇到的错误

  

“发生了类型为'System.FormatException'的未处理异常    mscorlib.dll

     

其他信息:输入字符串的格式不正确。”

是因为您正在选择字符串值

cmd.CommandText = "SELECT **UserPassword**, UserMail FROM Users WHERE ....

然后您尝试将其转换为Int

correct = Convert.**ToInt32**(cmd.ExecuteScalar());

ExecuteScalar执行查询,并返回查询返回的结果集中第一行的第一列。其他列或行将被忽略。

因此,您正在尝试将密码值转换为Int32,这将引发错误...

如果您使用

cmd.CommandText = "SELECT Count(*) FROM Users WHERE ....

您的其余代码将正常工作,因为该条件只是检查是否正确大于0

sqlConnection1.Open();
int correct = 0;
correct = Convert.ToInt32(cmd.ExecuteScalar());
sqlConnection1.Close();

if(correct <= 0)

但是,您必须意识到SQL注入和其他不良做法的风险,但是没有主题