【发布时间】:2013-08-22 06:56:34
【问题描述】:
我正在处理一个项目,在该项目中我有一个表单,我可以通过该表单编辑列表视图中可用的问题。每当我从列表视图中选择一行并单击“修改”按钮时,列表视图上方的文本框都会加载问题及其选项。
这意味着当我在列表视图中选择一行并单击“修改”按钮时,问题会自行加载到文本框中。我在那里编辑问题并单击“保存”以保存更改,但我无法访问文本框中的数据。上面写着{"Input string was not in a correct format."}。
我的frmFormWizard'编辑'按钮的代码如下:
frmFormWizard.cs 代码:
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;
using System.Data.Sql;
using System.Data.SqlClient;
namespace SurveyBuilder
{
public partial class frmFormWizard : Form
{
int intPanelNumber = 1;
Boolean blnCancel = false;
//int intFlag = 1;
public frmFormWizard()
{
InitializeComponent();
}
...
private void btnEditTwoOrMoreOptions_Click(object sender, EventArgs e)
{
int QuestionID;
string sql;
QuestionID = Convert.ToInt32(lvTwoOrMoreOptions.SelectedItems[0].Text.ToString());
{
SqlConnection cn = new SqlConnection();
SqlCommand rs = new SqlCommand();
SqlDataReader sdr = null;
clsConnection clsCon = new clsConnection();
clsCon.fnc_ConnectToDB(ref cn);
sql = "";
sql += "SELECT * FROM SurveyQuestionLog WHERE SurveyQuestionLog.QuestionLogID = "+ QuestionID +"";
//sql += "SELECT * FROM SurveyQuestionLog";
rs.Connection = cn;
rs.CommandText = sql;
sdr = rs.ExecuteReader();
while (sdr.Read())
{
txtTwoOrMoreQuestions.Text = (string)sdr["Question"];
txtOption1.Text = (string)sdr["Choice1"];
...
}
sdr.Close();
rs = null;
cn.Close();
}
}
每当我尝试编译代码时,它都会显示"{"Input string was not in a correct format."}",并且此错误显示在以下行:
QuestionID = Convert.ToInt32(lvTwoOrMoreOptions.SelectedItems[0].Text.ToString());
请让我知道我做错了什么。
【问题讨论】:
-
不要使用字符串连接来生成你的 SQL 语句使用参数,否则你会让它对 SQL 注入开放。
-
lvTwoOrMoreOptions.SelectedItems[0].Text.ToString() 的运行时值是多少?另外,“Text”不应该已经是一个字符串,使 .ToString() 变得多余吗?
-
@Lloyd 说的是真的:xkcd.com/327
-
@Nolonar 这与 C#、字符串连接和参数有什么关系?
-
@Default 与 C# 无关,与 SQL 有关。由于 SQL 语句是字符串,因此您可以通过在需要变量的地方编写有效的 SQL 语句来将命令“注入”到 SQL。当您连接字符串以生成 SQL 语句时,用户可能会滥用此功能,如漫画中所述。这基本上就是 xkcd 的 Lloyd 和 Randall Munroe 试图传达的内容。当然,您可以连接字符串并且仍然可以避免 SQL 注入,但是使用参数而不是连接是最简单的方法。
标签: c# .net winforms visual-studio-2010