[英]Oracle Invalid Number
我正在嘗試在日期之間進行搜索並進行分頁。 但是我遇到錯誤“ ORA-01722:無效號碼”,我該如何解決此感謝。
public IEnumerable<LaboratuvarTest> ListePagingTariheGore(int SAYFA, DateTime tarihbaslangic, DateTime tarihbitis)
{
string tarihbas = tarihbaslangic.ToString("dd-MM-yyyy");
string tarihbit = tarihbitis.ToString("dd-MM-yyyy");
DateTime b = tarihbaslangic.ToLocalTime();
DateTime d = tarihbitis.Date;
if (!connection.Baglan()) return null;
OracleCommand cmd = new OracleCommand();
cmd.CommandText = "SELECT * FROM(SELECT a.*, rownum r__ FROM(SELECT ID,BARKOD,RUTUBET,COPSAP,OKSIDEEDILMEMISPARCA,VOLUM,DUYUSALANALIZ,DUSUNCELER,TADIM,AMBALAJKONTROL,KASAYADOKULENCAY,SELULOZ,EKSTRAT,DURUM FROM HAR_TBLLABORATUVARTEST WHERE DURUM = 1 AND TESTTARIHI BETWEEN TO_CHAR(:p2, 'dd/mm/yyyy') AND TO_CHAR(:p3, 'dd/mm/yyyy') ORDER BY TESTTARIHI DESC )a WHERE rownum < ((:p1 * 5) + 1) ) WHERE r__ >= (((:p1 - 1) * 5) + 1)";
cmd.Parameters.Add("p1", SAYFA);
cmd.Parameters.Add("p2", tarihbas);
cmd.Parameters.Add("p3", tarihbit);
cmd.Connection = connection.con;
OracleDataReader reader = cmd.ExecuteReader();
List<LaboratuvarTest> list = new List<LaboratuvarTest>().FromDataReader(reader).ToList();
connection.BaglantiKapat();
return list; ;
}
“ ORA-01722:無效的號碼”
ID NUMBER(5,0)
BARKOD VARCHAR2(50 BYTE)
RUTUBET NUMBER(8,0)
COPSAP NUMBER(8,0)
OKSIDEEDILMEMISPARCA NUMBER(8,0)
VOLUM NUMBER(8,0)
DUYUSALANALIZ NUMBER(8,0)
DUSUNCELER VARCHAR2(500 BYTE)
TADIM VARCHAR2(500 BYTE)
AMBALAJKONTROL VARCHAR2(500 BYTE)
KASAYADOKULENCAY NUMBER(3,0)
SELULOZ VARCHAR2(50 BYTE)
EKSTRAT VARCHAR2(50 BYTE)
TESTTARIHI DATE
KULLANICIREF NUMBER(5,0)
DURUM NUMBER(1,0)
這個桌子
{01.08.2018 00:00:00} {14.08.2018 00:00:00}這些日期即將生效。
我可以選擇何時運行內部的第一個選擇查詢,但是這3個不能一起運行idk為什么
您綁定到查詢的tarihbas
和tarihbit
參數已經是字符串,您不應在其上調用to_char
。 實際上,您根本不應該在其中使用字符串-您應該直接使用日期:
TESTTARIHI BETWEEN :p2 AND p3
並分別將tarihbaslangic
和tarihbitis
綁定為p2
和p3
。
您正在使用的oracle查詢需要更正。 確保:p2和:p2綁定變量是字符串,格式為“ dd / mm / yyyy”;
SELECT * FROM(SELECT a.*, rownum r__ FROM(SELECT ID,BARKOD,RUTUBET,COPSAP,OKSIDEEDILMEMISPARCA,VOLUM,DUYUSALANALIZ,DUSUNCELER,TADIM,AMBALAJKONTROL,KASAYADOKULENCAY,SELULOZ,EKSTRAT,DURUM FROM HAR_TBLLABORATUVARTEST WHERE DURUM = 1 AND TESTTARIHI BETWEEN TO_DATE(:p2, 'dd/mm/yyyy') AND TO_DATE(:p3, 'dd/mm/yyyy') ORDER BY TESTTARIHI DESC )a WHERE rownum < ((:p1 * 5) + 1) ) WHERE r__ >= (((:p1 - 1) * 5) + 1)
您已將參數定義為字符串,並按如下所示填充它們:
tarihbas = tarihbaslangic.ToString("dd-MM-yyyy")
但是,當您在查詢中使用它們時,嘗試再次將它們轉換為字符串:
TESTTARIHI BETWEEN TO_CHAR(:p2, 'dd/mm/yyyy') and TO_CHAR(:p3, 'dd/mm/yyyy')
由於它們已經是字符串,並且因為TESTTARIHI是日期,所以將它們轉換為日期會更有意義:
TESTTARIHI BETWEEN TO_date(:p2, 'dd-mm/yyyy') and TO_date(:p3, 'dd-mm-yyyy')
更好的方法是將參數作為DATE傳遞,並且完全不需要數據類型轉換。
您可以像這樣更改數據解析
DateTime.Parse(博士[ “TARIH”]的ToString())的ToString( “DD-MM-YY”)。
我解決了問題。 這是因為從參數開始排序。 cmd.Parameters.Add("p1", tarihbas); cmd.Parameters.Add("p2", tarihbit); cmd.Parameters.Add("p3", SAYFA);
以這種風格它將起作用。 如此煩人的錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.