【问题标题】:Lost end of the string丢失的字符串末端
【发布时间】:2014-04-29 07:09:39
【问题描述】:

我有一个问题,几天都解决不了。 我的简单代码(dll文件):

public static string RegisterUser(string table, string l, string p)
{
    string query = "INSERT INTO " + table + "(login, password) VALUES ('" + l + "','" + p + "');";
    return query;
}

一切正常,但是当我想写入网络上接收到的数据时,它并没有返回完整的字符串,例如

string recieveStr = Encoding.UTF8.GetString(connection.Buffer); //received text: RegUser:nipercop:passwrd
string[] strArr = recieveStr.Split(':');
if (strArr[0].Equals("RegUser"))
{
    // string p = strArr[2]; //passwrd
    // sendStr = SqlCommands.RegisterUser("users",strArr[1], "passwrd");//works fine
    sendStr = SqlCommands.RegisterUser("users",strArr[1], strArr[2]); // doesn't work
 }

这样返回消息:

INSERT INTO users(mail, password) VALUES ('nipercop','passwrd

字符串“')”的结尾丢失。没有错误,没有警告,没有任何东西。 我尝试在服务器、客户端将编码更改为 ASCII,但没有效果。

【问题讨论】:

  • strArr[2] 给你哪个值?
  • 我同意@AngryTiger,您的字符串有可能包含不应该包含的内容(即可能需要String.Trim()ing。您发布的示例RegisterUser() 方法也需要3 个参数,您的示例用法仅使用 2 调用它 - 还有其他重载方法吗?
  • 抱歉各位,我更正了代码。

标签: c# winforms sqlite networking


【解决方案1】:

尝试使用string.Format:

string.Format(@"INSERT INTO {0}(login, password) VALUES ('{1}','{2}');", table, l, p);

虽然理想情况下您应该使用prepared SQL statements。原因是您插入的任何值都可能包含意外值,这会使您的代码容易受到SQL injection 和大量其他坏事的影响。

例如,如果strArr[2] 在此处包含",则会中断查询并导致错误。就目前而言,您的代码在看似接受来自远程套接字的输入时并未考虑到这一点。这是您可能需要修改的内容。

【讨论】:

    【解决方案2】:

    问题是从缓冲区中读取字符串。

    Encoding.UTF8.GetString(connection.Buffer,0 , bufferLength);
    

    因为缓冲区长度是(例如)1024 字节,而我的最后一个变量是其他变量长度的余数,即包含一个空符号(空格)。失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      • 1970-01-01
      相关资源
      最近更新 更多