1

日付検索に問題がある古い .NET 2.0 サイトで作業しています。

MM/DD/YYYY数時間のトラブルシューティングの後、送信されている検索パラメーターが形式になっており、SQL Server が期待しているという結論に達しました。DD/MM/YYYY

これを修正する方法がわかりません。

私はそれを ( .ToString("dd/MM/yyyy")) で文字列に変換してから に戻そうとしましたDateTime。nullableである必要があるため、これは機能しませんDateTime

CS1502: 'TableAdapters.Artist_ListTableAdapter.GetData(int, System.DateTime?, System.DateTime?, int?, int?, bool?, string, string, string, int?, int?, int? , int?, int?, out int?)' には無効な引数があります

現在、SQL Server ストアド プロシージャについてあまり理解していないため、そのGetData関数の見方がわかりません。右クリックして定義に移動すると、生成された c# ページが表示されます。

何か助けはありますか?

編集:@BigMこれが役立つかどうかはわかりませんが:

Var 宣言:

public DataTable dtArtist = new DataTable();
public string cp_basePath;
public int pagecount;
int CultureId ;
DateTime? startDate;
DateTime? endDate;
int? disciplineId = null;
int? minimumGradelevel = null;
int? maximumGradelevel = null;
int? languageId = null;
bool? isFeatured = null;
int? educationalInitiativeId = null;
string EducationalInitiativeIds = string.Empty;
string sortColumnName = string.Empty;
string searchCriteria = string.Empty;

クエリ文字列から取得:

private void GetQueryStrings()
{
    CultureId = objGeneralLayer.plCultureId;
    if (Request.QueryString["StartDate"] != null)
        startDate = Convert.ToDateTime(Request.QueryString["StartDate"].ToString(), CultureInfo.InvariantCulture);
    if (Request.QueryString["EndDate"] != null)
        endDate = Convert.ToDateTime(Request.QueryString["EndDate"].ToString(), CultureInfo.InvariantCulture);
    if (Request.QueryString["DisciplineId"] != null)
        disciplineId = Convert.ToInt32(Request.QueryString["DisciplineId"].ToString());
    if (Request.QueryString["MinGrade"] != null)
        minimumGradelevel = Convert.ToInt32(Request.QueryString["MinGrade"].ToString());
    if (Request.QueryString["MaxGrade"] != null)
        maximumGradelevel = Convert.ToInt32(Request.QueryString["MaxGrade"].ToString());
    if (Request.QueryString["LanguageId"] != null)
        languageId = Convert.ToInt32(Request.QueryString["LanguageId"].ToString());
    if (Request.QueryString["Featured"] != null)
        isFeatured = Convert.ToBoolean(Request.QueryString["Featured"].ToString());
    if (Request.QueryString["EducatIds"] != null)
        EducationalInitiativeIds = Request.QueryString["EducatIds"].ToString();
    if (Request.QueryString["Criteria"] != null)
        searchCriteria = Request.QueryString["Criteria"].ToString();
}

その後、コードで次のように記述します。

dtArtist = objArtistLayer.getArtistList(CultureId,startDate, endDate, disciplineId, languageId, minimumGradelevel, maximumGradelevel, isFeatured, sortColumnName, searchCriteria, EducationalInitiativeIds, Stakeholder, currPage, pageSize, out rowCount);

その後、次のようになります。

public DataTable getArtistList( int CultureId ,
                                DateTime? StartDate
                                ,DateTime? EndDate
                                ,int? DisciplineId
                                ,int? LanguageId
                                ,int? MinimumGradeLevel
                                ,int? MaximumGradeLevel
                                ,bool? IsFeature
                                ,string ColumnName
                                ,string Criteria
                                ,string EducationalInitiativeIds
                                ,int ? StakeholderId
                                ,int StartPage   
                                ,int PageSize   
                                ,out int RowCount   
                                )
{
    int? count = 0;
    StartDate = Convert.ToDateTime(StartDate);
    DataTable dt = new DataTable();
    TableAdapters.Artist_ListTableAdapter ada = new TableAdapters.Artist_ListTableAdapter();
    dt = ada.GetData(CultureId
                    , StartDate
                    , EndDate
                    , MinimumGradeLevel
                    , MaximumGradeLevel
                    , IsFeature
                    , ColumnName
                    , Criteria
                    , EducationalInitiativeIds
                    , StakeholderId
                    , DisciplineId
                    , LanguageId
                    , StartPage
                    , PageSize
                    , out count
                    );
    RowCount = (int)count;
    return dt;
4

2 に答える 2

3

DateTime形式はありません。日付/時刻の値です。それを文字列に変換してから日付に戻すのは無意味です。同じ値が返されます。

QueryStringパラメータを文字列から日付に変換しているときに、問題が発生する可能性が高くなります。これは、日付を文字列として表す、投稿したコード内の唯一の場所です。特定の形式を強制する何らかの方法が必要です。そうしないと、形式を推測Convert.ToDateTimeしようとしますが、月と日があいまいな場合は間違っている可能性があります。たとえば、2013 年 2 月 3 日は 2 月 3 日ですか、それとも 3 月 2 日ですか?

クエリ文字列変数が ALWAYS の形式である場合は、mm/dd/yyyyを使用ParseExactして次の形式に変換しますDateTime

CultureInfo provider = CultureInfo.InvariantCulture;

if (Request.QueryString["StartDate"] != null)
    startDate = DateTime.ParseExact(Request.QueryString["StartDate"], "MM/dd/yyyy", provider);
if (Request.QueryString["EndDate"] != null)
    endDate = DateTime.ParseExact(Request.QueryString["EndDate"], "MM/dd/yyyy", provider);
于 2012-11-09T20:24:43.130 に答える
0

例外として、メソッドのシグネチャは次のようにする必要があります。

TableAdapters.Artist_ListTableAdapter.GetData(int, System.DateTime?, System.DateTime?, int?, int?, bool?, string, string, string, int?, int?, int?, int?, int?, out int?)

しかし、あなたはそれを次のように呼びます:

ada.GetData(CultureId,
                    ArtistId
                    , StakeholderId
                    , StartDate
                    , EndDate
                    , DisciplineId
                    , MinimumGradeLevel
                    , MaximumGradeLevel
                    , LanguageId
                    , IsFeature
                    , ShowId
                    );

パラメータに不一致が存在することがわかります。例外として、DateTimeパラメータは2番目と3番目である必要があります。しかし、あなたはそれを4番目と5番目と呼びます。

于 2012-11-09T20:09:51.257 に答える