private void BindParameters()

in csharp/src/Client/AdbcCommand.cs [260:472]


        private void BindParameters()
        {
            if (_dbParameterCollection?.Count > 0)
            {
                Field[] fields = new Field[_dbParameterCollection.Count];
                IArrowArray[] parameters = new IArrowArray[_dbParameterCollection.Count];
                for (int i = 0; i < fields.Length; i++)
                {
                    AdbcParameter param = (AdbcParameter)_dbParameterCollection[i];
                    switch (param.DbType)
                    {
                        case DbType.Binary:
                            var binaryBuilder = new BinaryArray.Builder();
                            switch (param.Value)
                            {
                                case null: binaryBuilder.AppendNull(); break;
                                case byte[] array: binaryBuilder.Append(array.AsSpan()); break;
                                default: throw new NotSupportedException($"Values of type {param.Value.GetType().Name} cannot be bound as binary");
                            }
                            parameters[i] = binaryBuilder.Build();
                            break;
                        case DbType.Boolean:
                            var boolBuilder = new BooleanArray.Builder();
                            switch (param.Value)
                            {
                                case null: boolBuilder.AppendNull(); break;
                                case bool boolValue: boolBuilder.Append(boolValue); break;
                                default: boolBuilder.Append(ConvertValue(param.Value, Convert.ToBoolean, DbType.Boolean)); break;
                            }
                            parameters[i] = boolBuilder.Build();
                            break;
                        case DbType.Byte:
                            var uint8Builder = new UInt8Array.Builder();
                            switch (param.Value)
                            {
                                case null: uint8Builder.AppendNull(); break;
                                case byte byteValue: uint8Builder.Append(byteValue); break;
                                default: uint8Builder.Append(ConvertValue(param.Value, Convert.ToByte, DbType.Byte)); break;
                            }
                            parameters[i] = uint8Builder.Build();
                            break;
                        case DbType.Date:
                            var dateBuilder = new Date32Array.Builder();
                            switch (param.Value)
                            {
                                case null: dateBuilder.AppendNull(); break;
                                case DateTime datetime: dateBuilder.Append(datetime); break;
#if NET5_0_OR_GREATER
                                case DateOnly dateonly: dateBuilder.Append(dateonly); break;
#endif
                                default: dateBuilder.Append(ConvertValue(param.Value, Convert.ToDateTime, DbType.Date)); break;
                            }
                            parameters[i] = dateBuilder.Build();
                            break;
                        case DbType.DateTime:
                            var timestampBuilder = new TimestampArray.Builder();
                            switch (param.Value)
                            {
                                case null: timestampBuilder.AppendNull(); break;
                                case DateTime datetime: timestampBuilder.Append(datetime); break;
                                default: timestampBuilder.Append(ConvertValue(param.Value, Convert.ToDateTime, DbType.DateTime)); break;
                            }
                            parameters[i] = timestampBuilder.Build();
                            break;
                        case DbType.Decimal:
                            var value = param.Value switch
                            {
                                null => (SqlDecimal?)null,
                                SqlDecimal sqlDecimal => sqlDecimal,
                                decimal d => new SqlDecimal(d),
                                _ => new SqlDecimal(ConvertValue(param.Value, Convert.ToDecimal, DbType.Decimal)),
                            };
                            var decimalBuilder = new Decimal128Array.Builder(new Decimal128Type(value?.Precision ?? 10, value?.Scale ?? 0));
                            if (value is null)
                            {
                                decimalBuilder.AppendNull();
                            }
                            else
                            {
                                decimalBuilder.Append(value.Value);
                            }
                            parameters[i] = decimalBuilder.Build();
                            break;
                        case DbType.Double:
                            var doubleBuilder = new DoubleArray.Builder();
                            switch (param.Value)
                            {
                                case null: doubleBuilder.AppendNull(); break;
                                case double dbl: doubleBuilder.Append(dbl); break;
                                default: doubleBuilder.Append(ConvertValue(param.Value, Convert.ToDouble, DbType.Double)); break;
                            }
                            parameters[i] = doubleBuilder.Build();
                            break;
                        case DbType.Int16:
                            var int16Builder = new Int16Array.Builder();
                            switch (param.Value)
                            {
                                case null: int16Builder.AppendNull(); break;
                                case short shortValue: int16Builder.Append(shortValue); break;
                                default: int16Builder.Append(ConvertValue(param.Value, Convert.ToInt16, DbType.Int16)); break;
                            }
                            parameters[i] = int16Builder.Build();
                            break;
                        case DbType.Int32:
                            var int32Builder = new Int32Array.Builder();
                            switch (param.Value)
                            {
                                case null: int32Builder.AppendNull(); break;
                                case int intValue: int32Builder.Append(intValue); break;
                                default: int32Builder.Append(ConvertValue(param.Value, Convert.ToInt32, DbType.Int32)); break;
                            }
                            parameters[i] = int32Builder.Build();
                            break;
                        case DbType.Int64:
                            var int64Builder = new Int64Array.Builder();
                            switch (param.Value)
                            {
                                case null: int64Builder.AppendNull(); break;
                                case long longValue: int64Builder.Append(longValue); break;
                                default: int64Builder.Append(ConvertValue(param.Value, Convert.ToInt64, DbType.Int64)); break;
                            }
                            parameters[i] = int64Builder.Build();
                            break;
                        case DbType.SByte:
                            var int8Builder = new Int8Array.Builder();
                            switch (param.Value)
                            {
                                case null: int8Builder.AppendNull(); break;
                                case sbyte sbyteValue: int8Builder.Append(sbyteValue); break;
                                default: int8Builder.Append(ConvertValue(param.Value, Convert.ToSByte, DbType.SByte)); break;
                            }
                            parameters[i] = int8Builder.Build();
                            break;
                        case DbType.Single:
                            var floatBuilder = new FloatArray.Builder();
                            switch (param.Value)
                            {
                                case null: floatBuilder.AppendNull(); break;
                                case float floatValue: floatBuilder.Append(floatValue); break;
                                default: floatBuilder.Append(ConvertValue(param.Value, Convert.ToSingle, DbType.Single)); break;
                            }
                            parameters[i] = floatBuilder.Build();
                            break;
                        case DbType.String:
                            var stringBuilder = new StringArray.Builder();
                            switch (param.Value)
                            {
                                case null: stringBuilder.AppendNull(); break;
                                case string stringValue: stringBuilder.Append(stringValue); break;
                                default: stringBuilder.Append(ConvertValue(param.Value, Convert.ToString, DbType.String)); break;
                            }
                            parameters[i] = stringBuilder.Build();
                            break;
                        case DbType.Time:
                            var timeBuilder = new Time32Array.Builder();
                            switch (param.Value)
                            {
                                case null: timeBuilder.AppendNull(); break;
                                case DateTime datetime: timeBuilder.Append((int)(datetime.TimeOfDay.Ticks / TimeSpan.TicksPerMillisecond)); break;
#if NET5_0_OR_GREATER
                                case TimeOnly timeonly: timeBuilder.Append(timeonly); break;
#endif
                                default:
                                    DateTime convertedDateTime = ConvertValue(param.Value, Convert.ToDateTime, DbType.Time);
                                    timeBuilder.Append((int)(convertedDateTime.TimeOfDay.Ticks / TimeSpan.TicksPerMillisecond));
                                    break;
                            }
                            parameters[i] = timeBuilder.Build();
                            break;
                        case DbType.UInt16:
                            var uint16Builder = new UInt16Array.Builder();
                            switch (param.Value)
                            {
                                case null: uint16Builder.AppendNull(); break;
                                case ushort ushortValue: uint16Builder.Append(ushortValue); break;
                                default: uint16Builder.Append(ConvertValue(param.Value, Convert.ToUInt16, DbType.UInt16)); break;
                            }
                            parameters[i] = uint16Builder.Build();
                            break;
                        case DbType.UInt32:
                            var uint32Builder = new UInt32Array.Builder();
                            switch (param.Value)
                            {
                                case null: uint32Builder.AppendNull(); break;
                                case uint uintValue: uint32Builder.Append(uintValue); break;
                                default: uint32Builder.Append(ConvertValue(param.Value, Convert.ToUInt32, DbType.UInt32)); break;
                            }
                            parameters[i] = uint32Builder.Build();
                            break;
                        case DbType.UInt64:
                            var uint64Builder = new UInt64Array.Builder();
                            switch (param.Value)
                            {
                                case null: uint64Builder.AppendNull(); break;
                                case ulong ulongValue: uint64Builder.Append(ulongValue); break;
                                default: uint64Builder.Append(ConvertValue(param.Value, Convert.ToUInt64, DbType.UInt64)); break;
                            }
                            parameters[i] = uint64Builder.Build();
                            break;
                        default:
                            throw new NotSupportedException($"Parameters of type {param.DbType} are not supported");
                    }

                    fields[i] = new Field(
                        string.IsNullOrWhiteSpace(param.ParameterName) ? Guid.NewGuid().ToString() : param.ParameterName,
                        parameters[i].Data.DataType,
                        param.IsNullable || param.Value == null);
                }

                Schema schema = new Schema(fields, null);
                AdbcStatement.Bind(new RecordBatch(schema, parameters, 1), schema);
            }
        }