2013-04-25 9 views
12

verir "Ölçüt ifadesinde veri türü uyuşmazlığı" diyen bir istisna alıyorum.bu</p> <pre><code>cmd.CommandText = "INSERT INTO [table] ([date]) VALUES (?)"; cmd.Parameters.AddWithValue("?", DateTime.Now); </code></pre> <p>gibi "Veri türü uyuşmazlığı" hatayı

Herkes bana nedenini söyleyebilir mi? Burada neyin yanlış gidiyor?

biraz deneme sonra ben bu az anlaşılır, daha az temiz görünüyor gibi

OleDbParameter parm = new OleDbParameter("?", OleDbType.Date); 
parm.Value = DateTime.Now; 
cmd.Parameters.Add(parm); 

yazmak ama bunu yaparken eğer o iş yapabilir bulundu. Bu neden gerekli? Basit bir şeye mi bakıyordum?

+0

'date' burada bir anahtar kelime olabilir. INSERT INTO tablosunu deneyin ([tarih]) DEĞERLER (?) ' – LarsTech

+0

@LarsTech Tabii ki bir anahtar kelime olmak konusunda haklısınız. Söz konusu kodu güncelledim. Ama sorunun sebebi bu değil. –

cevap

22

Ölçüt ifadesinde uyuşmazlığı sorun AddWithValue çağırdığınızda DateTime.Now değerini göstermek için kullanılır parametreye atanan OleDbType kaynaklanır: Yani bugünün tarihini eklemek için.

AddWithValue tarafından seçilen OleDbType değeri DBTimeStamp, ancak Access OleDbType.Date istiyor. Başka bir Intersting ucu bulduk NET üzerinde arama

http://support.microsoft.com/kb/320435

. Temel sorun, OleTbParameter'da DateTime.Now öğesinin milisaniye bölümünü işleyemeyen bir sorundur. Muhtemelen OleDbType'ı Date olmak için zorlamak, milisaniye kısmı ihmal edilir. Ayrıca, milisaniye tarihini kaldırırsanız, ek parçanın da DBTimeStamp türüyle çalıştığını da öğrendim.

cmd.Parameters.AddWithValue("?", GetDateWithoutMilliseconds(DateTime.Now)); 

private DateTime GetDateWithoutMilliseconds(DateTime d) 
{ 
    return new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second); 
} 

Bunu daha iyi açıklayan birini bekliyorum.

+0

+ 1, 'cmd.Parameters.AddWithValue (DateTime.Today "?"); 'çalışır. – LarsTech

+2

@LarsTech evet, ama zaman kısmı gitti – Steve

+1

Kurban bir Access veritabanı ile yapılmalıdır. :-) – LarsTech

5

En basit ifade, db motorunun geçerli Tarih/Saat değerini almak için Now() işlevini kullanmasını ister. Ya da günün saatiyle ilgilenmiyorsanız, Date() işlevini kullanabilirsiniz; Date() aslında size gece yarısı kadar zaman verecek.

INSERT INTO [table] ([date]) VALUES (Now()); 

IOW, Erişim db eklemek için sırayla .Net bir Tarih/Saat değerini masaj rahatsız gerekmez.

Bir hazır tarih değeri içeren bir INSERT bildirimi istiyorsanız, # tarih sınırlayıcılarını kullanın.

INSERT INTO [table] ([date]) VALUES (#2013-04-25#); 
+1

Sanırım C# kullanmıyor VBA – Mike

+2

@Mike Programlama dili önemli değil çünkü 'Now()' ACE/Jet veritabanı motorlarında yerleşik bir işlevdir. –

+1

@Mike Access SQL kendi yerleşik 'Now()' ve 'Tarih() işlevlerini destekler. Bu bir C# vs VBA türü sorunu değil. Bu SQL deyimi, programlama diline bakılmaksızın db'ye geçerli bir bağlantıdan yürütüldüğünde çalışır. – HansUp

İlgili konular