使用“BETWEEN”检索字段时出错

时间:2017-04-19 13:12:07

标签: c# sql between


我正在研究一个项目而且我遇到了一个问题。我的最终目的是从IP地址获取国家,为此我拥有一个包含所有从地址到IP地址的数据库。我的问题是我在使用'BETWEEN'的查询时遇到错误。带有信息的表'tb_CountryIP'就是这样的(我只表示了第一个和最后一个记录):

|   ID   |   IP_From   |   IP_To    |   Country   |
|    1   |   16777216  |  16777471  |     AU      |
                      ...
| 148614 | 3758095872  | 3758096127 |     SG      |

我使用该查询的函数是:

private string GetCountry(uint ipNum)
    {
        string resultStr= null;
        string query = $@"SELECT Country FROM tb_CountryIP WHERE '{ipNum.ToString()}' BETWEEN 'IP_From' AND 'IP_To'";

        try
        {
            using(SqlConnection sqlConn = new SqlConnection(ConnectionStr))  // ConnectionStr reference to the connection string of the database
            {
                sqlConn.Open();

                using(SqlCommand sqlComm = new SqlCommand(query, sqlConn))
                {
                    resultStr= sqlComm.ExecuteScalar().ToString();
                }
            }
        }
        catch(Exception ex)
        {
            resultStr= $"Error : {ex.Message}";
        }
        return resultStr;
    }

最后我得到的错误是:

  

错误:Riferimento un unoggetto non impostato su un'istanza di oggetto。   
(已翻译:错误:对象引用未设置为对象的实例)

我无法理解错误的位置。

1 个答案:

答案 0 :(得分:2)

将字段IP_From和IP_To放在单引号之间会将这些名称转换为文字字符串。这两个字符串之间没有UINT,当代码到达ExecuteScalar时,返回值为NULL。当然,尝试将NULL转换为字符串会引发臭名昭着的NullReferenceException。

pid_t run_cmd(char *cmd) {
    pid_t pid, ret;
    char *argv[] = {"sh", "-c", cmd, NULL};
    int status, s;
    posix_spawn_file_actions_t file_actions;
    posix_spawn_file_actions_t *file_actionsp;

    s = posix_spawn_file_actions_init(&file_actions);
    if (s != 0)
        return 0;

    //STDERR_FILENO
    s = posix_spawn_file_actions_addclose(&file_actions,STDERR_FILENO);
    if (s != 0)
        return 0;

    file_actionsp = &file_actions;


    //printf("Run command: %s\n", cmd);
    status = posix_spawn(&pid, "/bin/sh", file_actionsp, NULL, argv, environ);
    if (status == 0) {
        log_level(8, "Child pid: %i\n", pid);
        ret = pid;
        /*        
        if (waitpid(pid, &status, 0) != -1) {
            printf("Child exited with status %i\n", status);
        } else {
            perror("waitpid");
        }
         */
    } else {
        //  printf("posix_spawn: %s\n", strerror(status));        
        ret = 0;
    }

    return ret;
    //printf("End of run\n");
}