【问题标题】:Resultset does not return any result from SQL Server 2012 View or Table结果集不从 SQL Server 2012 视图或表返回任何结果
【发布时间】:2015-11-30 14:14:31
【问题描述】:

以前,我正确连接到 SQL Server 2012 视图和表,但几天前,在我的好朋友的帮助下,我尝试从存储过程中进行选择,但没有机会。 所以我忘记了存储过程并尝试了一个视图。 我想从视图中选择数据。 这是我的代码:

statement = connectionHelper1.getMyConnection().createStatement();
ResultSet resultSet = statement.executeQuery("select Latitude from View_4 where IMEI='xxxxx'");
while (resultSet.next()) 
{
    i++;
}
Toast.makeText(getApplicationContext(), " : " + i, Toast.LENGTH_SHORT).show();

此代码在button.setOnClickListener 方法中。当我按下按钮时,它应该打印 I 变量,但它什么也不做。 但是当我在 SQL Server 2012 查询模式下打印此查询时,它会返回值并且结果集有效。 (我的意思是这个选择查询) 我应该说这个 View(View_4) 本身是从一个大约有 28,000,000 行的表中选择的!! 但是当我从另一个名为 View_2 的视图中选择并选择与此视图(View_2)相关的一些其他字段时,它会返回 I 和 ResultSet。 请注意,View_2 是另一个视图,包含与 View_4 不同的字段。 像这样:

statement = connectionHelper1.getMyConnection().createStatement();
ResultSet resultSet = statement.executeQuery("select Latitude from View_2 where name='xxxxxxx'");
while (resultSet.next()) {
    i++;
}
Toast.makeText(getApplicationContext(), " : " + i, Toast.LENGTH_SHORT).show();

下面的代码从查询返回值和结果,然后打印 I。 但是在我使用 View_4 的第一个代码中它不起作用。 我再次注意到 View_4 从具有 28,000,000 行的表中返回值。 所以我决定直接从那个表中选择,但仍然不能从那个表中选择。 行数是否可能是原因。 如果是,我该怎么办?

【问题讨论】:

  • 我看不出您的代码有任何问题(希望您在最后一个块中关闭 rs 和语句)。为确保您查询与 SQL Server 2012 中相同的架构,请在查询中包含完整架构名称并在 executeQuery 之后记录查询(以检查查询是否已执行以及是否进入循环。
  • 再次嗨皮特。是的,我总是从 android-studio 复制我的选择语句并在 SQL Server 管理中打开一个新的查询窗口,然后粘贴我的语句并从工作室执行。架构是 dbo。例如 dbo.View_2 即使使用模式,它也不会返回任何内容。 Logcat 中没有错误或错误。我可以从中选择的 View_2 在同一个数据库中。
  • 行数会影响查询所花费的时间……但要么它仍在执行,要么你得到一个错误……它不仅仅是跳过; )
  • 我将 wile 更改为 if 这样并使用 top 10 编辑选择,如下所示: if (resultSet.next()) { Toast.makeText(getApplicationContext(), "It Works !", Toast .LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), "出去!", Toast.LENGTH_LONG).show(); } 它不吐司!就像它在跳过一样!
  • 和简单查询:ResultSet resultSet = statement.executeQuery("select top 10 Latitude from dbo.View_4 where IMEI=N'xxxxxx'");我在IMEI前加了N,在SQL Studio中复制运行。在安卓工作室。执行需要 3-4 秒。

标签: java android sql-server sql-server-2012 executequery


【解决方案1】:

如何对现有的connection 执行查询。

String sql = "select Latitude from View_4 where IMEI='xxxxx'";
Statement std = null;
ResultSet rs = null;
logger.info("executeQuery - sql=" + sql);
try {
    std = connection.createStatement();
    rs = std.executeQuery(sql);
    logger.info("executeQuery - The query is executed");
    while (rs.next()) {
        String lat = rs.getString("Latitude");
        logger.info("executeQuery - Latitude=" + lat);
    }
    logger.info("executeQuery - Query End");
} catch (SQLException e) {
    logger.error("executeQuery", e); //log the full error
} finally {
    if (rs != null) {
        try {rs.close();} catch (SQLException sqle) {}
    }
    if (std != null) {
        try {std.close();} catch (SQLException sqle) {}
    }
}

在此代码示例中,您将在“executeQuery - sql = ..”之后的日志中看到

任一

executeQuery - 查询被执行

executeQuery - Latitude=" ...

executeQuery - 查询结束

错误 executeQuery 及其堆栈跟踪

在这之后你会明白发生了什么......,虽然你没有日志意味着它正在执行查询......防火墙 ecc 这次可以改变......

注意:让记录器适应您的 (android LOG),不要尝试使用标准 LOG。

【讨论】:

  • 通过这段代码我发现了问题。 DB的整理是我的问题,谢谢你的关注。我发现了问题!但我之前解决了它,我不知道为什么它仍然存在!我找到了它: java.sql.SQLException: The statement failed because column 'Latitude' (ID=0) uses collat​​ion Persian_100_CI_AI !但是我已将 DB 排序规则更改为 Latin1_General_100_CI_AS 当我转到 DB 的属性时,它会显示拉丁排序规则
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多