|
forums.silverfrost.com Welcome to the Silverfrost forums
|
View previous topic :: View next topic |
Author |
Message |
Astelix
Joined: 17 Dec 2008 Posts: 13
|
Posted: Fri Jan 02, 2009 1:43 pm Post subject: Typecasting between objects and Fortran types |
|
|
Im still experimenting with databases and ftn95/.net
Now i can read all data out of a datatable with the help of a C#-support class and i can convert the field-contents to fortran data with the help of conversion functions written in C#. But I can not do the conversion with the cast@ function in fortran. Casting to Integer brings strange values, casting to real causes memory access violations.
In the example code the not working fortran version is commented out (in the select case statement).
Why does this not work?
Fortran Source:
program ReadMDB
library ("System")
library ("System.Data")
library("ItemSelector.ItemSelector")
implicit none
object("System.Data.OleDb.OleDbCommand") :: myCommand
object("System.Data.OleDb.OleDbDataAdapter") :: myDataAdapter
object("System.Data.OleDb.OleDbConnection") :: myConn
object("System.Data.DataSet") :: myDataSet
object("System.Data.DataTableCollection") :: tabs
object("System.Data.DataRowCollection") :: rows
object("System.Data.DataColumnCollection") :: cols
object("System.Data.DataTable") :: myTab
object("System.Data.DataRow") :: myRow
object("System.Data.DataColumn") :: myCol
object :: myObj
object("System.Int16") :: myInt16
object("System.Int32") :: myInt32
object("System.Single") :: mySingle
object("System.Double") :: myDouble
string :: strConn,strSelect
integer(kind=3) :: res,nrows,ncols,r,c
integer(kind=2) :: shortvar
integer(kind=3) :: longvar
real(kind=1) :: singlevar
real(kind=2) :: doublevar
character(len=255) :: otype,fldname,charvar
assembly_external(name="System.Object.ToString") otostring
assembly_external(name="System.Data.OleDb.OleDbConnection.Open") dc_open
assembly_external(name="System.Data.OleDb.OleDbConnection.Close") dc_close
assembly_external(name="System.Data.OleDb.OleDbDataAdapter.Fill") da_fill
assembly_external(name="ItemSelector.ItemSelector.GetTable") gettable
assembly_external(name="ItemSelector.ItemSelector.GetRow") getrow
assembly_external(name="ItemSelector.ItemSelector.GetColumn") getcolumn
assembly_external(name="ItemSelector.ItemSelector.ObjectToShort") toshort
assembly_external(name="ItemSelector.ItemSelector.ObjectToLong") tolong
assembly_external(name="ItemSelector.ItemSelector.ObjectToSingle") tosingle
assembly_external(name="ItemSelector.ItemSelector.ObjectToDouble") todouble
assembly_external(name="ItemSelector.ItemSelector.ObjectToString") tostring
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Test.mdb"
strSelect = "SELECT * FROM tblTest"
myConn = new@("System.Data.OleDb.OleDbConnection",strConn)
myCommand = new@("System.Data.OleDb.OleDbCommand",strSelect,myConn)
myDataAdapter = new@("System.Data.OleDb.OleDbDataAdapter",myCommand)
myDataSet = new@("Syst |
|
Back to top |
|
|
Astelix
Joined: 17 Dec 2008 Posts: 13
|
Posted: Fri Jan 02, 2009 1:45 pm Post subject: continued |
|
|
myDataSet = new@("System.Data.DataSet")
res=da_fill(myDataAdapter,myDataSet,"Test")
tabs=MyDataset%Tables
mytab=gettable(tabs,0)
nrows=mytab%rows%count
ncols=mytab%columns%count
rows=mytab%rows
cols=mytab%columns
do r=0,nrows-1
print *, "Case: ", r
myrow=getrow(rows,r)
do c=0,ncols-1
mycol=getcolumn(cols,c)
fldname=mycol%caption
myobj=myrow%itemarray(c)
otype=otostring(myobj)
select case (otype)
case ("System.Int16")
shortvar=toshort(myobj)
! myInt16=cast@(myobj,"System.Int16")
! shortvar=myInt16
write(*,100) fldname,otype, shortvar
case ("System.Int32")
longvar=tolong(myobj)
! myInt32=cast@(myobj,"System.Int32")
! longvar=myInt32
write(*,100) fldname,otype, longvar
case ("System.Single")
singlevar=tosingle(myobj)
! mySingle=cast@(myobj,"System.Single")
! singlevar=mySingle
! write(*,100) fldname,otype, singlevar
case ("System.Double")
doublevar=todouble(myobj)
! myDouble=cast@(myobj,"System.Double")
! doublevar=myDouble
write(*,100) fldname,otype, doublevar
case ("System.String")
charvar=tostring(myobj)
! charvar=char(cast@(myobj,"System.String"))
write(*,100) fldname,otype, charvar
end select
100 Format (A20,2X, A15,2X, G35.0)
end do
end do
read *
call dc_close(myConn)
end program |
|
Back to top |
|
|
Astelix
Joined: 17 Dec 2008 Posts: 13
|
Posted: Fri Jan 02, 2009 1:46 pm Post subject: continued |
|
|
Supporting C# DLL:
using System;
using System.Collections.Generic;
using System.Text;
namespace ItemSelector
{
static public class ItemSelector
{
static public System.Data.DataTable GetTable(System.Data.DataTableCollection MyCollection, int Item)
{
return(MyCollection[Item]);
}
static public System.Data.DataColumn GetColumn(System.Data.DataColumnCollection MyCollection, int Item)
{
return ((System.Data.DataColumn)MyCollection[Item]);
}
static public System.Data.DataRow GetRow(System.Data.DataRowCollection MyCollection, int Item)
{
return (MyCollection[Item]);
}
static public Int32 ObjectToLong(object myobject)
{
if (myobject is Int32)
return (int)myobject;
else
throw new InvalidCastException();
}
static public Int16 ObjectToShort(object myobject)
{
if (myobject is Int16)
return (Int16)myobject;
else
throw new InvalidCastException();
}
static public Single ObjectToSingle(object myobject)
{
if (myobject is Single)
return (Single)myobject;
else
throw new InvalidCastException();
}
static public double ObjectToDouble(object myobject)
{
if (myobject is Double)
return (Double)myobject;
else
throw new InvalidCastException();
}
static public string ObjectToString(object myobject)
{
if (myobject is String)
return (string)myobject;
else
throw new InvalidCastException();
}
}
} |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 7938 Location: Salford, UK
|
Posted: Fri Jan 02, 2009 6:27 pm Post subject: |
|
|
I suspect that you have misunderstood what cast@ does.
It creates an alternative alias for a given object. It does not convert the object. The alias can have a different type but the object it points to is unchanged. |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|