2017-05-18 4 views
-1

ストアドプロシージャからの文字列とアクセス他の値にバイトを変換することにより、画像のURLを設定するためにそれからアップロードされた画像を見ているは、データベースのストアドプロシージャ

protected void Page_Load(object sender, EventArgs e) 
{ 
    string cs = ConfigurationManager.ConnectionStrings["CHTproductionConnectionString"].ConnectionString; 
    using (SqlConnection con=new SqlConnection(cs)) 
    { 
     SqlCommand cmd = new SqlCommand("spGetImageId", con); 
     cmd.CommandType = CommandType.StoredProcedure; 

     SqlParameter paramID = new SqlParameter() 
     { 
      ParameterName = "@Id", 
      Value = Request.QueryString["ID"] 
     }; 
     cmd.Parameters.Add(paramID); 

     con.Open(); 
     byte[] bytes = (byte[])cmd.ExecuteScalar(); 
     string strBase64 = Convert.ToBase64String(bytes); 
     Image1.ImageUrl = "data:Image/png;base64," + strBase64; 
    } 
} 

データベースとIDはURLから読んでいます。ストアドプロシージャを

に変更した場合
create procedure spGetImageId 
    @Id int 
as 
Begin 
    select title, description, imageData 
    from uploadTable 
    where ID = @Id 
End 

このコードを追加すると、タイトルと説明にアクセスできますか? URL内のidの変更に伴い画像が変化します。

このプロセスは機能しています。タイトルと説明にアクセスするだけです

+0

可能な重複のように呼び出すための再利用可能な方法を持っている(http://stackoverflow.com/questions/6003480/値の読み取り値をデータベースからCシャープに) – VDWWD

答えて

0

その他は、すでにあなたに答えを与えているが、私はすべてを分割することは良いアドバイスであるべきと思いました。

おそらく再利用する必要のあるビットのコード用のメソッドを作成することは良い方法です。ストアドプロシージャを実行すると、しばしば条件が満たされます。

public string ConnectionString 
{ 
    get 
    { 
     return ConfigurationManager.ConnectionStrings["CHTproductionConnectionString"].ConnectionString; 
    } 
} 

public DataTable GetDataTableFromSproc(string sproc, SqlParameter[] parameters) 
{ 
    using (SqlConnection con = new SqlConnection(this.ConnectionString)) 
    using (SqlCommand cmd = new SqlCommand(sproc, con) { CommandType = CommandType.StoredProcedure }) 
    using (SqlDataAdapter adapter = new SqlDataAdapter(cmd)) 
    { 
     con.Open(); 
     cmd.Parameters.AddRange(parameters); 
     DataTable dt = new DataTable(); 
     adapter.Fill(dt); 
     return dt; 
    } 
} 

次にあなたは[C#でSQLデータベースから値を読み込み]のように

protected void Page_Load(object sender, EventArgs e) 
{ 
    SqlParameter[] parameters = new SqlParameter[1]; 
    parameters[0] = new SqlParameter("@Id", SqlDbType.Int) { Value = Convert.ToInt32(Request.QueryString["ID"]) }; 

    DataTable dt = this.GetDataTableFromSproc("spGetImageId", parameters); 

    string title = dt.Rows[0]["title"].ToString(); 
    string description = dt.Rows[0]["description"].ToString(); 
    Image1.ImageUrl = "data:Image/png;base64," + Convert.ToBase64String((byte[])dt.Rows[0]["imageData"]); 
} 
+0

アーサーレイ。私はプロシージャ名を変更しました。 – Chakma

+0

ねえ、この問題を解決できますか?リンク:https://stackoverflow.com/q/47611023/7730795 – Chakma

0
cmd.ExecuteScalar 

これは返される最初の行の最初の列を返します。これは、プロシージャから単一のものを取得するだけでよい場合に便利ですが、その場合は複数を取得する必要があります。

これを行うには、SqlDataAdapterを使用する必要があります。コードをリファクタリングしないと、次のことができます。私は、データを取得するために使用される関数と、それを使用できるオブジェクトにロードする関数に分割することをお勧めします。余分なデータを取得しようとしている

string cs = ConfigurationManager.ConnectionStrings["CHTproductionConnectionString"].ConnectionString; 
using (SqlConnection con = new SqlConnection(cs)) 
{ 
    SqlDataAdapter Adapter = new SqlDataAdapter(); 
    DataSet TempData = new DataSet(); 
    SqlCommand cmd = new SqlCommand("spGetImageId", con); 
    cmd.CommandType = CommandType.StoredProcedure; 
    SqlParameter paramID = new SqlParameter() 
    { 
     ParameterName = "@Id", 
     Value = Request.QueryString["ID"] 
    }; 
    cmd.Parameters.Add(paramID); 
    con.Open(); 
    Adapter.SelectCommand = cmd; 
    Adapter.Fill(TempData); 
    string title = TempData.Tables[0].Rows[0]["title"].ToString(); 
    string description = TempData.Tables[0].Rows[0]["description"].ToString(); 
    string imageBytes = TempData.Tables[0].Rows[0]["imageData"].ToString(); 
    string strBase64 = Convert.ToBase64String(imageBytes); 
    Image1.ImageUrl = "data:Image/png;base64," + strBase64; 
} 
+0

より速く入力する必要があります。 –

0

あなたの主な問題は、ExecuteScalar()がものだけをレコードセットからの最初の行の最初の列を返すことです。それ以上の値を取得するには、ExecuteReader()メソッドを使用し、DataReader、DataTable、またはDataAdapterを使用してセットを処理する必要があります。

その他の変更:

  • 場合、Request.QueryStringはオブジェクト内の文字列を返し、nullにすることができます。文字列をテキストに変更する必要がある場合、SQLの実行時にエラーがスローされます。私は、文字列変数に追加この
  • を含むようにint型ImageID`」に追加され、
  • 活用のtry/catch /最後に
  • は、画像データ上のヌルチェックをした他のデータ(タイトル、DESC)のためにそれらを掲揚しましたImageコントロールに割り当てます。タイトル&説明の値も便利です。
  • 個別のSqlパラメータを直接cmd.Parameters.AddWithValue()メソッドに置き換えました。

これは、今どのように見えるかです:

protected void Page_Load(object sender, EventArgs e) { 
    string cs = ConfigurationManager.ConnectionStrings["CHTproductionConnectionString"].ConnectionString; 

    int ImageID; 
    string ImgTitle; 
    string ImgDesc; 
    string ImgBytes; 
    string strBase64; 

    if (!int.TryParse((string)Request.QueryString["ID"]), out ImageID) { 
     // STOP: querystring is not a number 
    } 
    else { 
     using (SqlConnection con=new SqlConnection(cs)) { 
      SqlCommand cmd = new SqlCommand("spGetImageId", con); 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Parameters.AddWithValue("@Id", ImageID); 

      try { 
       con.Open(); 
       var reader = cmd.ExecuteReader(); 

       if (reader.Read()) { 
        ImgTitle = reader[0].ToString(); 
        ImgDesc = reader[1].ToString(); 
        ImgBytes = reader[2].ToString(); 
        strBase64 = Convert.ToBase64String(ImgBytes); 
       } 
      } 
      catch (Exception ex) { 
       // handle exception 
      } 
      finally { 
       cmd.Dispose(); 
       conn.Close(); 
      } 
     } 
    } 

    if (strBase64 != null) { 
     Image1.ImageUrl = "data:Image/png;base64," + strBase64; 

     // utilize ImgTitle 
     // utilize ImgDesc 
    } 
} 
関連する問題