C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: MS-Accessデータがカレンダに表示できない


(過去ログ 88 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■52410 / inTopicNo.1)  MS-Accessデータがカレンダに表示できない
  
□投稿者/ akira (3回)-(2010/08/08(Sun) 22:16:05)

分類:[ASP.NET (VB)] 

MS-Accessのデータをカレンダコントロールに表示したいのですが、表示出来ずに困って
います。解決のヒントが頂ければ助かります。

MS-Accessのデータを↓このページの様にカレンダコントロールに表示したいです。
「Calendarコントロールのセルに任意のデータを埋め込むには?」
http://www.atmarkit.co.jp/fdotnet/dotnettips/277aspcalceldata/aspcalceldata.html

先ずは↓このページのASP.NET2.0から提供されたObjectDataSourceコントロールを用いた
http://www.atmarkit.co.jp/fdotnet/vs2005db/vs2005db_06/vs2005db_06_01.html
方法にSQL ServerをDBとして↓このページを改造しました。
http://www.atmarkit.co.jp/fdotnet/dotnettips/277aspcalceldata/aspcalceldata.html
結果、DBにSQL Serverを利用した場合は、希望通りデータをカレンダに表示する事が
出来ました。

次にDBの接続をSQL ServerからMS-Accessに変更したのですが、エラーメッセージは何も
でないのですが、画面にはカレンダだけ表示され、表示して欲しいMS-Accessに入力され
ている予定情報が表示されません。

MS-Accessに接続する為のConnectionString情報やProviderName情報は↓このページ情報
http://3939deb.seesaa.net/article/107785168.html#more
を参考にしました。

<%@ Page Language="VB" ContentType="text/html" %>
<%@ Import Namespace="System.Data.Common" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="Server">
    'MS-AccessDBのConnectionString
    Dim MyDbConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\AccessDB.mdb;Persist Security Info=True"
    'MS-AccessDBのProviderName
    Dim MyDbProviderName As String = "System.Data.OleDb"
    
    ' それぞれの日付セルをレンダリングするタイミングで実行
    Sub cal_DayRender(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DayRenderEventArgs)
        
        Dim setting As ConnectionStringSettings = _
          ConfigurationManager.ConnectionStrings(MyDbConnectionString)
        Dim factory As DbProviderFactory = _
          DbProviderFactories.GetFactory(MyDbProviderName)
        
        Using objDb As DbConnection = factory.CreateConnection()
            objDb.ConnectionString = MyDbConnectionString
            
            ' 出力する日付セルに対応するスケジュール情報を抽出
            Dim objCom As DbCommand = factory.CreateCommand()
            objCom.CommandText = "SELECT [ID],[title],[sdate],[stime],[etime] FROM [schedule01] WHERE [sdate]=@sdate ORDER BY [stime] ASC"
            objCom.Connection = objDb
            
            Dim objPrm As DbParameter = factory.CreateParameter()
            objPrm.ParameterName = "@sdate"
            objPrm.Value = e.Day.Date
            objCom.Parameters.Add(objPrm)
            
            objDb.Open()
            
            Dim objRd As DbDataReader = objCom.ExecuteReader()
            ' 取得したスケジュール情報を基に
            ' LiteralControl(固定文字列)を生成し、
            ' 日付セル(e.Call)配下のコントロールとして追加
            Do While objRd.Read()
                e.Cell.Controls.Add(New LiteralControl("<br />" & String.Format("{0}〜{1}:{2}", objRd.GetString(3), objRd.GetString(4), objRd.GetString(1))))
            Loop
        End Using
    End Sub
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>スケジュールをカレンダー上に表示する</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
  <asp:Calendar id="cal" runat="server"
    DayHeaderStyle-BackColor="#FFCC66"
    onDayRender="cal_DayRender" ShowGridLines="true"
    BorderWidth="3" BorderColor="Black" Font-Name="Verdana"
    Font-Size="10px" TitleStyle-BackColor="#FFCC66"
    TitleStyle-Font-Size="12px" TitleStyle-Font-Bold="true"
    DayStyle-VerticalAlign="Top" DayStyle-Height="50px"
    DayStyle-Width="14%" SelectedDayStyle-BackColor="Navy"
    ShowNextPrev="True" NextPrevFormat="FullMonth"> 
    <SelectedDayStyle BackColor="#CC5533" />
  </asp:Calendar>
        <br />
    
    </div>
    </form>
</body>
</html>


DBをSQL Serverに変更すると正しく動いてくれました。

'SQL ServerDBのConnectionString
Dim MyDbConnectionString As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\SQLCalendar.mdf;Integrated Security=True;User Instance=True"
'SQL ServerDBのProviderName
Dim MyDbProviderName As String = "System.Data.SqlClient"

また、AccessDataSourceコントロールでGridViewにMS-Accessデータを表示させてみると
正しく表示されました。

<%@ Page Language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
            DataKeyNames="ID" DataSourceID="AccessDataSource1">
            <Columns>
                <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" 
                    ReadOnly="True" SortExpression="ID" />
                <asp:BoundField DataField="title" HeaderText="title" SortExpression="title" />
                <asp:BoundField DataField="sdate" HeaderText="sdate" SortExpression="sdate" />
                <asp:BoundField DataField="stime" HeaderText="stime" SortExpression="stime" />
                <asp:BoundField DataField="etime" HeaderText="etime" SortExpression="etime" />
            </Columns>
        </asp:GridView>
        <asp:AccessDataSource ID="AccessDataSource1" runat="server" 
            DataFile="~/App_Data/AccessDB.mdb" 
            SelectCommand="SELECT [ID], [title], [sdate], [stime], [etime] FROM [schedule01]">
        </asp:AccessDataSource>
        <br />
    
    </div>
    </form>
</body>
</html>

開発:vwd2008、MS-Access2003、SQL Server2008

アドバイスよろしくお願い申し上げます。

引用返信 編集キー/
■52411 / inTopicNo.2)  Re[1]: MS-Accessデータがカレンダに表示できない
□投稿者/ もりお (255回)-(2010/08/08(Sun) 23:33:55)
No52410 (akira さん) に返信

SQL Server の場合に正しく動くということは SQL Server の場合も AccessDB の場合も
同一の処理である LiteralControl を作成して Cell に追加するという部分は問題なさそうですね
。AccessDB からのデータ取得がうまくいかないのかなと思います。

AccessDataSource コントロールを用いる場合にデータが表示されるということから考えると
AccessDataSource で発行する SQL とカレンダーのデータ取得時に発行する SQL の差異が気にな
ります。

カレンダーのデータ取得の SQL から Where 句と Order By 句を除去してデータが表示されないか
確認してみてはいかがでしょうか。

引用返信 編集キー/
■52414 / inTopicNo.3)  Re[2]: MS-Accessデータがカレンダに表示できない
□投稿者/ akira (4回)-(2010/08/09(Mon) 00:36:16)
No52411 (もりお さん) に返信
>
> ■No52410 (akira さん) に返信
>
> SQL Server の場合に正しく動くということは SQL Server の場合も AccessDB の場合も
> 同一の処理である LiteralControl を作成して Cell に追加するという部分は問題なさそうですね
> 。AccessDB からのデータ取得がうまくいかないのかなと思います。
>
> AccessDataSource コントロールを用いる場合にデータが表示されるということから考えると
> AccessDataSource で発行する SQL とカレンダーのデータ取得時に発行する SQL の差異が気にな
> ります。
>
> カレンダーのデータ取得の SQL から Where 句と Order By 句を除去してデータが表示されないか
> 確認してみてはいかがでしょうか。

objCom.CommandText = "SELECT [ID],[title],[sdate],[stime],[etime] FROM [schedule01] WHERE [sdate]=@sdate ORDER BY [stime] ASC"

objCom.CommandText = "SELECT [ID],[title],[sdate],[stime],[etime] FROM [schedule01]"
に変更したら、MS-Accessに登録してある予定全ての情報が日にちに関係なく、カレンダの
毎日にワッと一杯表示されました。
「WHERE [sdate]=@sdate」がうまく機能していないんだな?と仮説を立て
カレンダコントロールから取得してくる日付情報を10文字にきちっと成形してみました。
objPrm.Value = e.Day.Date

objPrm.Value = e.Day.Date.ToString("yyyy/MM/dd")

結果、全てが正しく動くようになりました。
問題がこんなにスピード解決するとは夢の様です。もりお様、本当にありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -