我正在研究一个项目而且我遇到了一个问题。我的最终目的是从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。
(已翻译:错误:对象引用未设置为对象的实例)
我无法理解错误的位置。
答案 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");
}