Parameter ?_1 has no default value.
- From: "Trees" <msnews.treesaregreen@xxxxxxxxxxxx>
- Date: Fri, 24 Nov 2006 18:08:14 +1100
The exception "Parameter ?_1 has no default value." is generated during:
retailOutDataAdapter.Update( retailOutDataTable );
I have attempted to test solving the problem by assisning what i thought
would be a default to use in the place of nulls with:
param.Value = "x";
but no joy.
private void OpenRetailPriceList() {
retailOutConnection = new OleDbConnection(
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + OutputFolder + "\\Retail
Price List.xls;Extended Properties=\"Excel 8.0;HDR=YES\"" );
retailOutConnection.Open();
retailOutDataAdapter = new OleDbDataAdapter( "SELECT * FROM
[Sheet1$A1:N1]", retailOutConnection );
retailOutDataTable = new DataTable();
retailOutDataAdapter.FillSchema( retailOutDataTable,
SchemaType.Source );
retailOutDataAdapter.Fill( retailOutDataTable );
string columns = "([" + retailOutDataTable.Columns[0].ColumnName
+ "],";
string parameters = "(?,";
int j = 0;
for (j = 1; j < retailOutDataTable.Columns.Count - 1; j++) {
columns += "[" + retailOutDataTable.Columns[j].ColumnName +
"],";
parameters += "?,";
}
columns += "[" + retailOutDataTable.Columns[j].ColumnName +
"])";
parameters += "?)";
retailOutDataAdapter.InsertCommand = new OleDbCommand( "INSERT
INTO [Sheet1$] " + columns + " values " + parameters, retailOutConnection );
for (int i = 0; i < retailOutDataTable.Columns.Count; i++) {
OleDbParameter param = new OleDbParameter("@[" +
retailOutDataTable.Columns[i].ColumnName + "]", OleDbType.Char, 255, "[" +
retailOutDataTable.Columns[i].ColumnName + "]");
param.Value = "x";
retailOutDataAdapter.InsertCommand.Parameters.Add( param );
}
}
private void MergeRetailPriceList( string mergePriceList ) {
OleDbConnection inConnection = new OleDbConnection(
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + OutputFolder + "\\" +
mergePriceList + ";Extended Properties=\"Excel 8.0;IMEX=1;HDR=YES\"" );
try {
inConnection.Open();
// init in data objects
OleDbDataAdapter inDataAdapter = new OleDbDataAdapter(
"select * from [Sheet1$]", inConnection );
DataTable inDataTable = new DataTable();
inDataAdapter.FillSchema( inDataTable, SchemaType.Mapped );
inDataAdapter.Fill( inDataTable );
// process rows from in to out
foreach (DataRow inDataRow in inDataTable.Rows) {
DataRow row = retailOutDataTable.NewRow();
for (int i = 0; i < retailOutDataTable.Columns.Count;
i++) {
row[i] = inDataRow[i];
}
retailOutDataTable.Rows.Add( row );
}
retailOutDataAdapter.Update( retailOutDataTable );
} finally {
inConnection.Close();
}
}
what is odd, is this is not a lot disimilar to code I wrote earlier which
works. The only difference that I can determine is the working code uses
CREATE TABLE to produce the result data. The broken code outputs data
instead to an existing spread*** that has just the column headings.
This is the code that does work if it's of interest.
private void GeneratePriceList( string source, string tab, string
dest ) {
// create output file named DEST filled with first 3 columns of
data from SOURCE
// init in and out connections
OleDbConnection inConnection = new OleDbConnection(
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + InputFolder + "\\" +
source + ";Extended Properties=\"Excel 8.0;IMEX=1;HDR=NO\"" );
OleDbConnection outConnection = new OleDbConnection(
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + OutputFolder + "\\" +
dest + ";Extended Properties=\"Excel 8.0;HDR=NO\"" );
try {
inConnection.Open();
try {
outConnection.Open();
// init in data objects
OleDbDataAdapter inDataAdapter = new OleDbDataAdapter(
"select * from [" + tab + "$]", inConnection );
DataTable inDataTable = new DataTable();
inDataAdapter.FillSchema( inDataTable,
SchemaType.Source );
inDataAdapter.Fill( inDataTable );
// init out data objects
OleDbCommand createCommand = new OleDbCommand( "CREATE
TABLE Sheet1 (F1 char(255)," +
"F2 char(255)," +
"F3 char(255)," +
"F4 char(255)," +
"F5 char(255)," +
"F6 char(255)," +
"F7 char(255)," +
"F8 char(255)," +
"F9 char(255)," +
"F10 char(255)," +
"F11 char(255)," +
"F12 char(255)," +
"F13 char(255)," +
"F14 char(255)," +
"F15 char(255)," +
"F16 char(255)," +
"F17 char(255)," +
"F18 char(255)," +
"F19 char(255)," +
"F20 char(255))", outConnection );
createCommand.ExecuteNonQuery();
OleDbDataAdapter outDataAdapter = new
OleDbDataAdapter( "SELECT * FROM [Sheet1$A1:T10]", outConnection );
string columns = "(F1,";
string parameters = "(?,";
int j = 0;
for (j = 1; j < inDataTable.Columns.Count - 1; j++) {
columns += "F" + (j+1) + ",";
parameters += "?,";
}
columns += "F" + (j+1) + ")";
parameters += "?)";
outDataAdapter.InsertCommand = new OleDbCommand( "INSERT
INTO [Sheet1$] " + columns + " values " + parameters, outConnection );
// Odd how F1, etc is the default column naming
convention if I use SELECT *. If I use SELECT A, B, C I get no value given
for one or more parameters (?,?,...) matching
for (int i = 0; i < inDataTable.Columns.Count; i++) {
outDataAdapter.InsertCommand.Parameters.Add( "@F" +
(i+1), OleDbType.Char, 255, "F" + (i+1) );
}
DataTable outDataTable = new DataTable();
outDataAdapter.FillSchema( outDataTable,
SchemaType.Mapped );
outDataAdapter.Fill( outDataTable );
// process rows from in to out
foreach (DataRow inDataRow in inDataTable.Rows) {
DataRow row = outDataTable.NewRow();
for (int i = 0; i < inDataTable.Columns.Count; i++)
{
row["F" + (i+1)] = inDataRow[i].ToString();
}
outDataTable.Rows.Add( row );
}
outDataAdapter.Update( outDataTable );
} finally {
outConnection.Close();
}
} finally {
inConnection.Close();
}
}
.
- Follow-Ups:
- Re: Parameter ?_1 has no default value.
- From: Bob Barrows [MVP]
- Re: Parameter ?_1 has no default value.
- Prev by Date: Re: ADO Data Control = changing ConnectionString at runtime
- Next by Date: Re: Too many arguments in Stored Proc (VB6)
- Previous by thread: Connection Collection
- Next by thread: Re: Parameter ?_1 has no default value.
- Index(es):