1

私はこれに対する解決策を探していましたが、これまでのところ、他の人にも同様の問題が発生しているにもかかわらず、機能するものは何も見つかりませんでした. 次のコードを使用して 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

列とパラメーターが正しいデータ型であるという事実を考えると、このエラーが発生する場所はどこにもありません。

誰でもこれに光を当てることができますか?

4

1 に答える 1

1

問題は、次のセクションにあります。

'POLYGON(('+@5+'...

POLYGON(('これにより、テキストがパラメーターと一致する@Sように (追加できるように) 、テキストが float に変換されます。

代わりに、各パラメーターを でラップしてみてくださいCONVERT。次に例を示します。

'POLYGON(('+CONVERT(VARCHAR(100),@5)+'...

すべてが+演算子の文字列になり、代わりに連結されます。

代替バージョンでは、すでに varchar への変換を自分で処理しているため、問題はありません。

于 2012-06-07T08:19:28.560 に答える