2009-08-01 4 views
2

이 매개 변수에 어떤 문제가 있습니까?

7 필드가있는 액세스 파일이 있습니다.

DocID - text - primary 
SourceID - text 
ReceivedDay - Date/Time 
Summary - text 
DueDay - Date/Time 
Person - text 
Status - Yes/No 

이제이 파일을 다음 코드로 업데이트하려고합니다.

const string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\\DocMan.mdb;Persist Security Info=True"; 
const string InsertQuery = "INSERT Into Docs(DocID,ReceivedDay,Summary,Person,DueDay,Status,SourceID) Values(@DocID,@ReceivedDay,@Summary,@Person,@DueDay,@Status,@SourceID)"; 

string DocID = textBox1.Text; 
string SourceID = comboBox1.SelectedIndex.ToString(); 
DateTime ReceivedDay = dateTimePicker1.Value; 
string Summary = richTextBox1.Text; 
string Person = textBox2.Text; 
DateTime DueDay = dateTimePicker2.Value; 
bool Status = false; 

OleDbConnection cnn = new OleDbConnection(ConnectionString); 
cnn.Open(); 
OleDbCommand cmd = new OleDbCommand(InsertQuery, cnn); 
cmd.Parameters.AddWithValue("@DocID", DocID); 
cmd.Parameters.AddWithValue("@SourceID", SourceID); 
cmd.Parameters.AddWithValue("@ReceivedDay", ReceivedDay); 
cmd.Parameters.AddWithValue("@Summary", Summary); 
cmd.Parameters.AddWithValue("@Person", Person); 
cmd.Parameters.AddWithValue("@DueDay", DueDay); 
cmd.Parameters.AddWithValue("@Status", Status); 
cmd.ExecuteNonQuery(); 
cnn.Close(); 

그러나 예외가 발생합니다.

Data type mismatch in criteria expression. 

방법 이 문제를 해결할 수 있습니까?

편집 : 다른 접근 방식을 사용하여 수정 :

그런 쿼리를 작성했습니다 :

INSERT INTO Docs 
    (DocID, SourceID, ReceivedDay, Summary, Person, DueDay, Status) 
VALUES (?, ?, ?, ?, ?, ?, ?) 

다음 TableAdapter 호출 할 :

string DocID = textBox1.Text; 

string SourceID = comboBox1.SelectedIndex.ToString(); 
DateTime ReceivedDay = dateTimePicker1.Value.Date; 
string Summary = richTextBox1.Text; 
string Person = textBox2.Text; 
DateTime DueDay = dateTimePicker2.Value.Date; 
bool Status = false; 

DocManDataSetTableAdapters.DocsTableAdapter docsTableAdapter = new DocManDataSetTableAdapters.DocsTableAdapter(); 
docsTableAdapter.InsertQuery(DocID,SourceID,ReceivedDay,Summary,Person,DueDay,false); 

많이 더 간단하고 잘 작동합니다. 감사합니다 모두

+0

InsertQuery의 텍스트를 보여 주시겠습니까? –

+0

나는 그것을 추가했다 :)! – Vimvq1987

+0

열에 제약 조건이 있습니까? –

답변

6

매개 변수가 추가 할 때과 같은 순서가 아니기 때문에 문제가 발생했습니다.

예를 들어, 주석 라인 (//adapter.InsertQuery...), 당신은 DocID 다음 RecievedDay이 ... 아직 당신이 그들을 추가 할 때, 먼저 DocID을 추가 한 다음 SourceID를 추가합니다.

이들이 동일한 순서로 있는지 확인하십시오. 이는 SQL 문이나 저장 프로 시저 모두에 적용됩니다.

OLEDB 공급자를 사용할 때 ADO.NET에서 명명 된 매개 변수를 지원하지 않기 때문에 Access 데이터베이스에 연결하고 있기 때문에 실제로 OLEDB 공급자를 사용하고 있기 때문에 매개 변수 순서가 중요합니다. 그들은 순서대로, 그것은 여전히 ​​작동하지 않는 경우


, 그럼 나는 그것이 DateTime들에 문제가 될 수 있다고 생각; 또한

cmd.Parameters.AddWithValue("@ReceivedDay", ReceivedDay.ToShortDateString()); 
cmd.Parameters.AddWithValue("@DueDay", DueDay.ToShortDateString()); 

그리고 날짜의 형식은 미국의 형식 (m/d/yyyy) 또는은 OleDb가하는 (yyyy-mm-dd)

+0

@Dreas : DocID 및 SourceID는 문자열이며 정수로 구문 분석하는 것이 필요하지 않습니다. – Vimvq1987

1

ISO 형식으로되어 있는지 확인하십시오
매개 변수로 추가하기 전에 문자열로 변환 시도 명명 된 매개 변수를 지원하지 않으므로 Dreas의 대답이 정확합니다.

OleDb를 사용하는 경우 사용자가 제공 한 이름이 사용되지 않으므로 OleDb를 사용할 때 쿼리에 나타나는 순서와 동일한 순서로 매개 변수를 추가해야합니다.

+0

작동하지 않는데 왜 'AddWithValue' 메소드가 있습니까? – Coops

9

간단히 말해 ask google인데, 10000 개가 넘는 히트 곡이 인상적입니다. 귀하의 인수는 "나는 생각하지 않습니다 ..."은 귀하가 그것을 입증하기 전에는 유효하지 않습니다.

MSDN 말한다 이것은 무엇 :

는 OLE DB.NET 공급자는 CommandType이 Text로 설정된 경우 OleDbCommand에 의해 호출되는 SQL 문이나 저장 프로 시저에 매개 변수를 전달할 때 명명 된 매개 변수를 지원하지 않습니다. 이 경우 물음표 (?) 자리 표시자를 사용해야합니다. 예를 들어

SELECT * FROM Customers WHERE 
CustomerID = ? 

그러므로 OleDbParameter 개체가 OleDbParameterCollection에 추가되는 순서 직접 명령 텍스트의 파라미터 물음표 자리의 위치에 대응한다.

+0

나는 이것을 해결했다. 고맙습니다! – Vimvq1987

+0

+1 그게 그 설명입니다. –

관련 문제