2017-01-23 3 views
0

MSDN docsによる0〜255の数値を取るTINYINT列に挿入しようとしています。残念ながら、それは0から127までかかります。私は128以上を挿入しようとした場合、それは文句:有効なTINYINT値を拒否しているMSSQL ODBC(数値が範囲外です)

[22003] (native 0): [Microsoft][ODBC Driver 11 for SQL Server]Numeric value out of range 

、それはすべての整数を取るためのもの、一般的なコードですが、私はそれが数字0〜127のための理由は問題べきではないと思うので、データがSQL_C_SBIGINTとしてバインドされていますそれは正しく動作します。 SQL_C_CHAR文字列として送信するオプションもありますが、同じエラーが返されます。

問題がどこにあるのでしょうか?

+1

'SQL_TINYINT'を試しましたか? – wdosanjos

+0

署名されていない/署名されたものであるのだろうか?コード内の値は符号なしintですか? – MikeS

+0

Nope。私は、64ビットのintを使用する1つのプログラミング言語用のODBCドライバを作成しているので、BIGINTとしてすべてを送信しています。 SQL Serverが自動的に変換するべきではありませんか? AFAIKはい、それが0-127で動作するので、私はそれが問題だとは思わない。そして私が言ったように、私はまた文字列として送信しようとしましたが、これもうまく機能しましたが、再び0-127のためだけでした。 – omusil

答えて

1

ので、問題は実際にあるため、テストの一環として、私はSQLFetch()を使用してバック挿入されたデータを「選択」とSQLGetData()、とに用いるターゲットデータ型としてして起こっていましたSQLGetData()関数では、別名SQL_C_STINYINTを使用しました。したがって、データを挿入するときに問題は発生しませんでしたが、それらを「選択」しようとしたときに問題が発生しました。

0

答えは実際には既に与えられていますが、強調表示されていません。

TINYINTは、1バイトのの整数です。 Hex 00からHex 7F(またはBin 0000 0000〜0111 1111、またはDec 0〜127)のすべての値は正の値です。 Hex 80からHex FF(またはBin 1000 0000〜1111 1111またはDec 128〜255)までのすべての値は負です。

127より大きい符号付き整数の場合、2バイトの整数SMALLINTを使用する必要があります。

SMALLINTは、TINYINTより多くのデータベースプラットフォームでサポートされています。

実際に1バイトの整数が必要な場合は、64ビット整数をC++でunsigned charにキャストし、ホスト変数unsigned charに入れる必要があります。

しかし、あなたはフロントエンドで127を超え、他のツールを使用してデータベースからSELECTすれば、 "正しい"値だけが表示されます。ゴミは見えます。

幸運 - マルコ・セイン

+0

これについてはわかりません。私がリンクを投稿した文書によると、範囲は0-255の1バイトの符号なし整数です。 'TINYINT UNSIGNED'はMSSQLで作成することさえできません。実際に負のintを送信しようとすると、算術オーバーフローに関するエラーがスローされますが、それはポイントではありません。また、私は本当に自分でそれを必要としません、私はちょうどODBCモジュールを開発し、SQL Serverがドキュメントに従って有効であるべき値を拒否しているのか疑問に思っています。 – omusil

関連する問題