C#に画像を保存し、データベースから画像を取得するときに発生する問題

ディレクトリ

1.はじめに

2.オペランドタイプの競合:nvarcharはイメージと互換性がありません

問題の説明

問題の原因

解決策

3. C# '(@ PERSONAL_PHOTO image、@ SURNAME nvarchar(4000)、@ MIN_NAME nvarcha'のパラメーター化クエリには、パラメーター '@PASSPORT'が必要ですが、パラメーターが指定されていません。

問題の説明

問題の原因

解決策

4.データベースから画像データを取得するときに、取得した画像データがnullかどうかを判断する方法の問題が発生しました

問題の説明

参考資料

毎日元気で頑張ってください!


1.はじめに

最近、MVCフレームワークに基づくC#プロジェクトに取り組んでいますが、Web端末がユーザー情報をバックグラウンドで保存されているデータベースに転送し、データから取得して、Webインターフェースにエコーバックする必要があることに気付きました。いくつかの質問、ここに記録

2.オペランドタイプの競合:nvarcharはイメージと互換性がありません

問題の説明

フロントエンド情報を送信するときに、アップロードされなかった画像があります。この問題は、データベースへの書き込み時に発生します。データベースの画像タイプは画像です。

問題の原因

データベースがイメージタイプの場合、挿入ステートメントを実行すると、挿入された値がDBNull.Valueの場合、プロンプトが表示されます:オペランドタイプの競合:nvarcharはイメージと互換性がありません。この問題の理由は、DbTypeが指定されていないためです。ほとんどの場合、SqlParameterを使用する場合、パラメーターのデータ型(DbTypeまたはSqlDbType)を指定する必要はありません。ADO.Netは、値の型に従ってデータ型を自動的に決定します。ADO.Netがそれを決定できない場合でも、SQLServerデータベースサーバーは、判断のほとんどを行います(もちろん、一部のパフォーマンスは失われます)。
しかし、このプログラムの画像タイプについては、私はそれほど幸運ではありません。DbTypeが指定されておらず、データがNull / DbNullである場合、ado.netはデータタイプをnvarcharとして認識し、上記のエラーが発生します。したがって、DbTypeまたはSqlDbTypeを指定するだけです。

解決策

新しいSqlParameter( "@ Photo"、SqlDbType.Image){Value = recruitment.PASSPORT}

3. C# '(@ PERSONAL_PHOTO image、@ SURNAME nvarchar(4000)、@ MIN_NAME nvarcha'のパラメーター化クエリには、パラメーター '@PASSPORT'が必要ですが、パラメーターが指定されていません。

問題の説明

以前の問題を解決した後、新しい問題が発生し、写真はまだアップロードされていなかったため、recruitment.PASSPORT = null

問題の原因

CのnullはSQLのnullと直接考えられるため、パラメーターが指定されていないと見なされます。

解決策

CのNUllはSQLのnullと同じではありません。SQLのnullは、C#ではDBNull.Valueとして表されます。

新しいSqlParameter( "@ Photo"、SqlDbType.Image){Value = TableSqlCon.TODBNull(recruitment.PASSPORT)}

 public static object TODBNull(byte[] image)
        {
            if (image != null)
            {
                return image;
            }
            else
            {
                return DBNull.Value;
            }
        }

4.データベースから画像データを取得するときに、取得した画像データがnullかどうかを判断する方法の問題が発生しました

問題の説明

データから取得した画像データは、recruitment.PASSPORT =(byte [])dt.Rows [0] [21]などのバイト[]タイプに強制的に変換されますが、画像が空の場合、エラーが報告されます:システムを使用できません。 DBNullはバイト[]に変換され、それが空であるかどうかを判断しようとします(dt.Rows [0] [21]!= Null)およびその他の試みがすべて失敗した場合。

解決策

 正しい記述:if(dt.Rows [0] [21]はSystem.DBNull)

 if (dt.Rows[0][21] is System.DBNull)
                    {
                        recruitment.PASSPORT = null;
                    }
                    else
                    {
                        recruitment.PASSPORT =(byte[]) dt.Rows[0][21];
                    }

参考資料

https://blog.csdn.net/weixin_30675967/article/details/99175174?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPhone

https://blog.csdn.net/kaixin_5200_kaixin/article/details/23115953

https://blog.csdn.net/weixin_30270889/article/details/97839671

毎日元気で頑張ってください!

元の記事を30件公開 Like1 Visits1158

おすすめ

転載: blog.csdn.net/chunchunlaila/article/details/105353856
おすすめ