所以我在C#中创建并调用了一个WCF服务,但是不断回复,我不确定它为什么会这样。它可能与连接字符串有关,但从当前更改它只会给我带来错误。
这是我的代码:
//Create the new connection
SqlConnection myConnection = new SqlConnection();
//Create the query
String myQuery = "INSERT INTO Player (registrationID, firstName, lastName, phoneNumber, Address, dateOfBirth) " +
" VALUES ('" + registrationID + "', '" + firstName + "', '" + lastName + "', '" + phoneNumber + "', '" + Address + "', '" + dateOfBirth + "');";
//The connectionString can be found in the properties table of the database
myConnection.ConnectionString = "Data Source=C:/Users/User/Documents/Visual Studio 2012/Projects/ADO_LINQ/ADO_LINQ/App_Data/MyDatabase.sdf";
//Initialuze the command
SqlCommand myCommand = new SqlCommand(myQuery, myConnection);
SqlDataReader myReader;
//Run the command
try
{
myConnection.Open();
myReader = myCommand.ExecuteReader();
//Return true if it was successful
return true;
}
catch (Exception ex)
{
return false;
}
答案 0 :(得分:0)
正如Soner所指出的,您的代码容易受到SQL注入攻击,这可以通过使用参数化查询来解决。此外,最佳做法是使用带有连接的using
块,以便在using
块中的代码退出后正确关闭并处理(目前您甚至没有关闭连接)当你完成了。)
此外,ExecuteNonQuery
就足够了 - 它将运行命令然后返回受影响的行数(在这种情况下应为1)。除了在异常情况下使用catch
块之外,您还可以检查受影响的行数并使用它来确定成功/失败。实际上,除了执行命令时抛出异常,我不会指望1 的值以外的其他内容。
最后,您发布的代码正在吞噬异常。你应该对异常做一些事情(记录它,执行一些其他代码,重新抛出它 - 取决于你的应用程序的要求)而不是简单地返回false。
全部放在一起:
using (SqlConnection myConnection = new SqlConnection())
{
// Create the query
String myQuery = "INSERT INTO Player (registrationID, firstName, lastName, phoneNumber, Address, dateOfBirth) " +
" VALUES (@RegistrationID, @FirstName, @LastName, @PhoneNumber, @Address, @DateOfBirth)";
//The connectionString can be found in the properties table of the database
myConnection.ConnectionString = "Data Source=C:/Users/User/Documents/Visual Studio 2012/Projects/ADO_LINQ/ADO_LINQ/App_Data/MyDatabase.sdf";
//Initialuze the command
SqlCommand myCommand = new SqlCommand(myQuery, myConnection);
myCommand.CommandType = CommandType.Text;
// Here you add the values for the parameters in the query
myCommand.Parameters.Add("@RegistrationID", SqlDbType.VarChar).Value = registrationID;
myCommand.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = firstName;
myCommand.Parameters.Add("@LastName", SqlDbType.VarChar).Value = lastName;
myCommand.Parameters.Add("@PhoneNumber", SqlDbType.VarChar).Value = phoneNumber;
myCommand.Parameters.Add("@Address", SqlDbType.VarChar).Value = address;
myCommand.Parameters.Add("@DateOfBirth", SqlDbType.VarChar).Value = dateOfBirth;
//Run the command
try
{
myConnection.Open();
int rowsAffected = myCommand.ExecuteNonQuery();
if (rowsAffected == 1)
{
return true;
}
else
{
return false;
}
}
catch (Exception ex)
{
// Do something with the exception, like logging it so you can review the error
return false;
}
}
上面的代码将调用包装在using
语句中。创建命令后,参数将添加到SqlCommand.Parameters
集合中,然后返回ExecuteNonQuery
。如果结果为1,则返回true,否则返回false。如果遇到错误,则返回false,但是您应该再次执行异常操作,以便在需要时进行故障排除。