私はこれに対する解決策を探していましたが、これまでのところ、他の人にも同様の問題が発生しているにもかかわらず、機能するものは何も見つかりませんでした. 次のコードを使用して SQL ステートメントを実行しています (見苦しい書式設定については申し訳ありません。ここで使用するものです)。
/// <summary>
/// Executes a prepared statement with the parameters passed to AddParameter(parameterName, parameterValue) and creates a recordset.
/// </summary>
///
/// <param name="sqlQuery">The sql statement to execute.</param>
public DbStandardResponseType ExecutePreparedStatementWithParametersQuery (string sqlQuery)
{
DbStandardResponseType dbFactoryResponse = new DbStandardResponseType();
if (String.IsNullOrEmpty (sqlQuery))
{
dbFactoryResponse.ExceptionMessage = "No query string passed.";
dbFactoryResponse.Success = false;
dbFactoryResponse.UserFriendlyMessage = "No query string passed.";
return dbFactoryResponse;
}
try
{
//attempt to prepare our connection
dbFactoryResponse = PrepareConnection();
if (!dbFactoryResponse.Success)
{
return dbFactoryResponse;
}
m_dbFactoryDatabaseCommand.CommandText = sqlQuery;
m_dbFactoryDatabaseCommand.CommandType = CommandType.Text;
if (m_parameterName.Count != 0)
{
for (int i = 0; i < m_parameterName.Count; i++)
{
//create a new parameter object and assign its values before adding it to the connection object
DbParameter parameter = m_dbFactoryDatabaseCommand.CreateParameter();
parameter.Value = m_parameterValue[i];
parameter.ParameterName = m_parameterName[i];
m_dbFactoryDatabaseCommand.Parameters.Add (parameter);
}
m_parameterName.Clear();
m_parameterValue.Clear();
}
m_hasRecordSet = true;
*****Error appears on this line inside the reader object*****
m_dbFactoryDatabaseDataReader = m_dbFactoryDatabaseCommand.ExecuteReader();
dbFactoryResponse.ExceptionMessage = "";
dbFactoryResponse.Success = true;
dbFactoryResponse.UserFriendlyMessage = "OK";
return dbFactoryResponse;
}
catch (Exception ex)
{
if (m_queueErrors)
{
m_queuedErrorsList.AppendLine (ex.Message);
m_queuedErrorsList.AppendLine ("\r\n\r\nPrepared Statement: " + sqlQuery);
m_queuedErrorsList.AppendLine();
m_queuedErrorCount++;
dbFactoryResponse.ExceptionMessage = m_queuedErrorsList.ToString();
dbFactoryResponse.Success = false;
dbFactoryResponse.UserFriendlyMessage = "Execute failed on the database.";
}
else
{
dbFactoryResponse.ExceptionMessage = ex.Message;
dbFactoryResponse.Success = false;
dbFactoryResponse.UserFriendlyMessage = "Execute failed on the database.";
}
try
{
Close();
}
catch (Exception f)
{
dbFactoryResponse.ExceptionMessage = f.Message + "\r\n\r\nPrepared Statement: " + sqlQuery;
dbFactoryResponse.Success = false;
dbFactoryResponse.UserFriendlyMessage = "Failed to close the connection to the database.";
}
return dbFactoryResponse;
}
}
クエリは次のとおりです (値が代入されています)。
select CONTRIBUTO, count(*) as CountCol
from HA_WITHOUT_SCOTLAND
where
GEOMETRY.STIntersects(geometry::STGeomFromText('POLYGON((-25.43623984375 44.257784519021, 21.62918984375 44.257784519021, 21.62918984375 60.752403080295, -25.43623984375 60.752403080295, -25.43623984375 44.257784519021))', 4326)) = 1
group by CONTRIBUTO
CONRIBUTO 列は varchar(max) GEOMETRY 列はジオメトリ データ型です
データベースでステートメントを直接実行すると、エラーなしで実行され、期待どおりの結果が返されます。
ただし、準備済みステートメント (C# コードの前のテーブルから取得) を使用して C# 経由で実行すると、エラーが発生します。渡されるパラメータは次のとおりです。
@5 = -25.43623984375 double
@6 = 44.257784519021 double
@7 = 21.62918984375 double
@8 = 60.752403080295 double
値が置換されていないクエリは次のとおりです。
select CONTRIBUTO, count(*)
from HA_WITHOUT_SCOTLAND
where STIntersects(GEOMETRY, geometry::STGeomFromText('POLYGON(('+@5+' '+@6+', '+@7+' '+@6+', '+@7+' '+@8+', '+@5+' '+@8+', '+@5+' '+@6+'))', 4326)) = 1
group by CONTRIBUTO
列とパラメーターが正しいデータ型であるという事実を考えると、このエラーが発生する場所はどこにもありません。
誰でもこれに光を当てることができますか?