1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
open System open System.Data open System.Data.SqlClient open System.Collections.Generic let sqlConnStr = let sqlConnStrBuilder = new SqlConnectionStringBuilder() sqlConnStrBuilder.DataSource <- "(local)" sqlConnStrBuilder.InitialCatalog <- "localDB" sqlConnStrBuilder.IntegratedSecurity <- true sqlConnStrBuilder.ConnectionString printfn "%s" sqlConnStr let GetSqlData() = use connDB = new SqlConnection( sqlConnStr ) use cmd = connDB.CreateCommand() cmd.CommandType <- CommandType.Text cmd.CommandText <- "SELECT Field1, Field2 FROM Table1" connDB.Open() let result = new ResizeArray<int*string>() use reader = cmd.ExecuteReader() while( reader.Read()) do result.Add( unbox reader.["Field1"], unbox reader.["Field2"] ) result.ToArray() let sqlData = GetSqlData()
Hi, Marekb:
Thank you very much, your code works.
However, if you read my question, I want to have a "general" version for different number of fields. Your code can work for data table with 2 fields, how about the data table with 3 fields?
Like Table2(Field1[nvarchar](5), Field2[int], Field3[xml])?
In this case, I have to re-write the code to get a new function.
But is it possible that use one function to cover the data table with many fields: 3, 4, 5, 6, 7, 8.
Just when I call the function, I provide different parameter, like commendText, and field name? The best is just to provide the SQL statement like: SELECT Field1,Field2,Field3 FROM Table2
Then the function can automatically fetch the data into the array of tuples.
But thank you very much first for your excellent code!
Have a nice weekend.
Hi, Marekb:
Thank you very much, your code works.
However, if you read my question, I want to have a "general" version for different number of fields. Your code can work for data table with 2 fields, how about the data table with 3 fields?
Like Table2(Field1[nvarchar](5), Field2[int], Field3[xml])?
In this case, I have to re-write the code to get a new function.
But is it possible that use one function to cover the data table with many fields: 3, 4, 5, 6, 7, 8.
Just when I call the function, I provide different parameter, like commendText, and field name? The best is just to provide the SQL statement like: SELECT Field1,Field2,Field3 FROM Table2
Then the function can automatically fetch the data into the array of tuples.
But thank you very much first for your excellent code!
Have a nice weekend.
Either you are using the wrong language or your are using the wrong data structure. In F#, n-tuple is a static type and it is of little use even you can dynamically create them in this function. As no other part of your code can use it unless you use reflection all the time. If that is the case, may be JronPython/IronRuby is more suitable.
You may use Dictionary<string,obj> as your object container instead of n-tuple but that again basically throw away F#'s type system.
And from your other questions I have seen so far, you may be better off using C#/VB or IronPython/IronRuby
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
open System open System.Data open System.Data.SqlClient open System.Collections.Generic type RowTuple = obj * obj * obj * obj * obj * obj * obj * obj let sqlConnStr = let sqlConnStrBuilder = new SqlConnectionStringBuilder() sqlConnStrBuilder.DataSource <- "(local)" sqlConnStrBuilder.InitialCatalog <- "DBTest" sqlConnStrBuilder.IntegratedSecurity <- true sqlConnStrBuilder.ConnectionString printfn "%s" sqlConnStr let GetSqlData() = try use connDB = new SqlConnection( sqlConnStr ) use cmd = connDB.CreateCommand() cmd.CommandType <- CommandType.Text cmd.CommandText <- "Select * FROM Table1" connDB.Open() let result = new ResizeArray<RowTuple>() use reader = cmd.ExecuteReader() let lnCountFields = reader.FieldCount let arrTuple = Array.create 8 null while( reader.Read()) do for index = 0 to arrTuple.Length - 1 do arrTuple.[index] <- null for index in 0 .. lnCountFields-1 do if index < 8 then arrTuple.[index] <- unbox reader.[reader.GetName( index ) ] let tuple = arrTuple[ 0 ],arrTuple.[ 1 ],arrTuple[ 2 ],arrTuple[ 3 ],arrTuple.[ 4 ],arrTuple[ 5 ],arrTuple[ 6 ],arrTuple[ 7 ] result.Add ( tuple ) Some( result.ToArray() ), lnCountFields with | ex -> printfn "%s" ex.Message None,0 let sqlData,countFields = GetSqlData() if sqlData.IsSome then printfn "%A" sqlData.Value else printfn "No data in database !"
Hello, Marekb:
Thank you very much. Your code in January 7 seems to be a good one.
I have changed it a little, so it looks like:
let GetSqlData3(sqlCmd: string) =
use connDB = new SqlConnection( sql_ConnDB )
use cmd = connDB.CreateCommand()
cmd.CommandType <- CommandType.Text
cmd.CommandText <- sqlCmd
connDB.Open()
let result = new ResizeArray<Dictionary<string,obj>>()
use reader = cmd.ExecuteReader()
let lnCountFields = reader.FieldCount
while( reader.Read()) do
// tuple as Dictionary
let tuple = new Dictionary<string,obj>()
for index in 0 .. lnCountFields-1 do
tuple.Add ( reader.GetName(index),reader.[reader.GetName(index)])
result.Add( tuple)
result.ToArray()
And I use this to get the result:
let dataTable2 = "SELECT Field1, Field2 FROM TABLE2"
I also tried data tables with different fields, including 2, 3, 4, 5, 9 and they all worked.
However, I want one more step further. If I get only one result set, I want to put the result into a tuple, so I can easily use the value, how I can do this?
For example, I want to use something like this:
let (aF1, aF2) = "SELECT TOP 1 Field1, Field2 FROM Table2"
But I got the error message:
This expression was expected to have type 'a * 'b but here has type Dictionary<string,obj> []
Any idea?
Thanks,
This expression was expected to have type 'a * 'b but here has type Dictionary<string,obj> []
Any idea?
Thanks,
That tells you exactly what is wrong, the return type of your 'generic' function doesn't match what you expect in the caller.
If you really want it sort of generic, the following is the closest I can get, making use of the nice LINQ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
type Region() = [<DefaultValue>]val mutable private _RegionId : int [<DefaultValue>]val mutable private _RegionDescription : string member public this.RegionId with get() = this._RegionId and set v = this._RegionId <- v member public this.RegionDescription with get() = this._RegionDescription and set v = this._RegionDescription <- v let inline Query2StrongType<'a when 'a:(new: unit->'a)> c q = let conn = new SqlConnection(c) let cmd = conn.CreateCommand() cmd.CommandText <- q cmd.CommandType <- CommandType.Text let res = cmd.ExecuteReader() let nw = new DataContext(conn) let d = nw.Translate<'a>(res) d let x = Query2StrongType<Region> "abc" "select * from Region"
However, I would prefer C# rather than F# for this particular case :
1. all the members needs to be mutable so C# is shorter than F#
2. the auto get;set; in C# makes it even shorter.
PS. how can one properly include code in post ?
Hello, Gary:
Thank you very much for your code.
But I think there is some HTML encoding issue, your code seems to be not correctly shown on the page. I have tried to use the following code:
type Region() = class
val mutable private _RegionId : int
val mutable private _RegionDescription : string
member public this.RegionId
with get() = this._RegionId
and set v = this._RegionId
member public this.RegionDescription
with get() = this._RegionDescription
and set v = this._RegionDescription
let inline Query2StrongType'a)> c q =
let conn = new SqlConnection(c)
let cmd = conn.CreateCommand()
cmd.CommandText <- q
cmd.CommandType <- CommandType.Text
let res = cmd.ExecuteReader()
let nw = new DataContext(conn)
let d = nw.Translate(res)
d
let x = Query2StrongType "abc" "select * from Region"
end
But I got the error message:
Incomplete structured construct at or before this point in pattern
For the statement: let inline Query2StrongType'a)> c q =
What did you really want for this statement.
Besides, can you explain how to use your code.
Thanks,
I have no idea how to include the < properly in the post.
The basic idea is to use the already created function(which you want) describe here [link:msdn.microsoft.com]
to turn a query result into array of a strong type. You would need to define the strong type once(but that is a good thing for C#/F# so you can minimize runtime type mismatch handling, or least localize it).
My code is just a demonstration of the idea, and don't expect it can be used unmodifed.
Hello, Gary:
I took a look at the MS web site, but I do not understand. Therefore, your code is rather important.
I think it is easy to show <
Just type in this forum without copying and pasting from F#, it should be OK. I guess < is just "<-", right? So if I can show you this, then it is the same for you. By the way, I am using FireFox, not IE on the forum.
Please let me know what you really want for this statement:
let inline Query2StrongType'a)> c q =
Thanks,
well, I have no idea how to put the angle brackets
it is basically
Query2StrongType['a]
but replace the square with angel
Hi, Gary:
Do you mean this?
let inline Query2StrongType<'a> c q =
But for me, it seems rather strange.
What does it mean?
yes I meant that.
This is called 'generic' which is what you are asking for, "one function that don't need to be changed in the future". This is such a function, you supply the desired strong type and it would fill out the fields using column name matches.
I believe you need some basic understanding of C# and the .NET framework if you want to write such a function.
That said, 80% of it has been written in LINQ, you just need to put them together, like my code showed.
BTW
it should also be read as nw.Translate['a](...) again replace square with angel
Hello, Gary:
I have tried to create a class using your code.
The following is my code.
#light
open System
open System.Collections.Generic
open System.Data
open System.Data.SqlClient
type Region() = class
val mutable private _RegionId : int
val mutable private _RegionDescription : string
member public this.RegionId
with get() = this._RegionId
and set v = this._RegionId
member public this.RegionDescription
with get() = this._RegionDescription
and set v = this._RegionDescription
let inline Query2StrongType<'a> c q =
let conn = new SqlConnection(c)
let cmd = conn.CreateCommand()
cmd.CommandText <- q
cmd.CommandType <- CommandType.Text
let res = cmd.ExecuteReader()
let nw = new DataContext(conn)
let d = nw.Translate(res)
d
end
However, I got the following errors:
Unintialized 'val' fields in implicit construction types must be mutable and marked with the '[<DefaultValue>]' attribute. Consider using a 'let' binding instead of a 'val' field. For the following statements:
val mutable private _RegionId : int
val mutable private _RegionDescription : string
This expression was expected to have type unit but here has type int for this:
and set v = this._RegionId
This expression was expected to have type unit but here has type string for this:
and set v = this._RegionDescription
I don't have enough knowledge about C#, but I have adequate knowledge about VB.NET.
Let me know how to make it compiled in F#, and how I can use it.
Thanks,
unless I find a way to post proper code here, there isn't much I can do.
the [<DefaultValue>] error is just that, read the error message and you can find out why. I encountered the same thing and add it back after reading the error message but it got eaten by the forum.
same goes for the other errors as they are all indentation problems which got eaten and you should not have problem putting them back. I would recommend you get a book of F# and learn the basic things first, like how a F# program is formatted like white space is significant etc.
The only thing is that the 'let Query2...' is not inside the Region class, it is a stand alone function.
If you are coming from a VB.NET background, please get yourself familiar with 'generics' in VB.NET as this is a very common thing in F#. Not knowing that won't get you too far no matter what.
Hello, Gary:
I changed the code, so it looks like this:
#light
open System
open System.Collections.Generic
open System.Data
open System.Data.SqlClient
type Region() = class
val mutable private _RegionId : int
val mutable private _RegionDescription : string
member public this.RegionId
with get() = this._RegionId
and set v = this._RegionId
member public this.RegionDescription
with get() = this._RegionDescription
and set v = this._RegionDescription
let inline Query2StrongType<'a> c q =
let conn = new SqlConnection(c)
let cmd = conn.CreateCommand()
cmd.CommandText <- q
cmd.CommandType <- CommandType.Text
let res = cmd.ExecuteReader()
let nw = new DataContext(conn)
let d = nw.Translate(res)
d
end
There are 2 error:
Block following this 'let' is unfinished. Expect an expression. For this:
let d = nw.Translate(res)
Unexpected identifier in member definition for this: d
According to MS web site: [link:msdn.microsoft.com]
Each row in the IDataReader is converted to an object in the IEnumerable<(Of <(T>)>).
But don’t quite understand the meaning of this statement, could you provide some sample on how to use it? But first, how I can make it compiled in F#, there are not many errors this time.
Thanks,
pull this line
let inline Query2StrongType
to the left(out dent)
then move the whole thing(all the way to the line d) out of the class. this is a function outside the class definition
and as I said, Translate should be Translate['a], replace square with angle
Hello, Gary:
I changed the code to look like this:
#light
open System
open System.Collections.Generic
open System.Data
open System.Data.SqlClient
type Region() = class
val mutable private _RegionId : int
val mutable private _RegionDescription : string
member public this.RegionId
with get() = this._RegionId
and set v = this._RegionId
member public this.RegionDescription
with get() = this._RegionDescription
and set v = this._RegionDescription
end
let inline Query2StrongType<'a> c q =
let conn = new SqlConnection(c)
let cmd = conn.CreateCommand()
cmd.CommandText <- q
cmd.CommandType <- CommandType.Text
let res = cmd.ExecuteReader()
let nw = new DataContext(conn)
let d = nw.Translate(res)
d
However, I got the following errors:
Unintialized 'val' fields in implicit construction types must be mutable and marked with the '[<DefaultValue>]' attribute. Consider using a 'let' binding instead of a 'val' field. For the following statements:
val mutable private _RegionId : int
val mutable private _RegionDescription : string
This expression was expected to have type unit but here has type int for this:
and set v = this._RegionId
This expression was expected to have type unit but here has type string for this:
and set v = this._RegionDescription
The type 'DataContext' is not defined
let nw = new DataContext(conn)
If my code is different from your code, let me know.
But I think it seems the class definition is missing something: there is no method defined, right?
Thanks,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
type Region() = [<DefaultValue>]val mutable private _RegionId : int [<DefaultValue>]val mutable private _RegionDescription : string member public this.RegionId with get() = this._RegionId and set v = this._RegionId <- v member public this.RegionDescription with get() = this._RegionDescription and set v = this._RegionDescription <- v let inline Query2StrongType<'a when 'a:(new: unit->'a)> c q = let conn = new SqlConnection(c) let cmd = conn.CreateCommand() cmd.CommandText <- q cmd.CommandType <- CommandType.Text let res = cmd.ExecuteReader() let nw = new DataContext(conn) let d = nw.Translate<'a>(res) d let x = Query2StrongType<Region> "abc" "select * from Region"
Hello, Gary:
Thank you for your code. I have changed my code, and I post all of them here:
#light
open System.Data
open System.Data.SqlClient
type Region() =
[<DefaultValue>]val mutable private _RegionId : int
[<DefaultValue>]val mutable private _RegionDescription : string
member public this.RegionId
with get() = this._RegionId
and set v = this._RegionId <- v
member public this.RegionDescription
with get() = this._RegionDescription
and set v = this._RegionDescription <- v
let inline Query2StrongType<'a when 'a:(new: unit->'a)> c q =
let conn = new SqlConnection(c)
let cmd = conn.CreateCommand()
cmd.CommandText <- q
cmd.CommandType <- CommandType.Text
let res = cmd.ExecuteReader()
let nw = new DataContext(conn)
let d = nw.Translate<'a>(res)
d
let x = Query2StrongType<Region> "abc" "select * from Region"
I got 2 errors:
1. The type 'DataContext' is not defined: for let nw = new DataContext(conn)
2. Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. It is for this statement: let d = nw.Translate<'a>(res)
By the way, I am using VS2010 with F# 1.9.7.4
Any idea?
Thanks,
you need to add the system.data.linq assembly to the reference.
the microsoft documentation about the translate method will show you exactly which name space it is in.
I continue to suggest that you spend some time understanding basic stuff as otherwise, if you take this code, you won't help much in incorporating it into your over all system
people can only give you rough ideas/directions like the code I show is not doing proper disposal of those objects(and I didn't intend to, it was a show case of the LINQ Translate function, nothing else).
Hi
I don't know how to create dynamic tuple ( unlimited size ) in F#,
but i try this simulate using Dictionary. Then result of my function is array of "dynamic tuples".
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
open System open System.Data open System.Data.SqlClient open System.Collections.Generic let sqlConnStr = let sqlConnStrBuilder = new SqlConnectionStringBuilder() sqlConnStrBuilder.DataSource <- "(local)" sqlConnStrBuilder.InitialCatalog <- "localDb" sqlConnStrBuilder.IntegratedSecurity <- true sqlConnStrBuilder.ConnectionString printfn "%s" sqlConnStr let GetSqlData() = try use connDB = new SqlConnection( sqlConnStr ) use cmd = connDB.CreateCommand() cmd.CommandType <- CommandType.Text cmd.CommandText <- "Select * FROM Table1" connDB.Open() let result = new ResizeArray<Dictionary<string,obj>>() use reader = cmd.ExecuteReader() let lnCountFields = reader.FieldCount while( reader.Read()) do // tuple as Dictionary let tuple = new Dictionary<string,obj>() for index in 0 .. lnCountFields-1 do tuple.Add ( reader.GetName(index),reader.[reader.GetName(index)]) result.Add( tuple) Some( result.ToArray() ) with | ex -> printfn "%s" ex.Message None let sqlData = GetSqlData() if sqlData.IsSome then printfn "%A" sqlData.Value else printfn "No data in database !"
Topic tags
- f# × 3705
- websharper × 1897
- compiler × 286
- functional × 201
- ui next × 139
- c# × 121
- classes × 97
- web × 97
- .net × 84
- book × 84
- async × 76
- ui.next × 67
- bug × 54
- core × 49
- website × 49
- server × 45
- parallel × 43
- ui × 43
- enhancement × 41
- parsing × 41
- testing × 41
- trywebsharper × 41
- typescript × 37
- html × 35
- javascript × 35
- owin × 35
- asynchronous × 30
- monad × 28
- ocaml × 28
- tutorial × 27
- warp × 27
- haskell × 26
- sitelet × 25
- linq × 22
- workflows × 22
- wpf × 20
- fpish × 19
- introduction × 19
- silverlight × 19
- sitelets × 19
- monodevelop × 17
- rpc × 17
- suave × 17
- piglets × 16
- collections × 15
- feature request × 15
- jquery × 15
- templates × 15
- getting started × 14
- pipeline × 14
- kendoui × 13
- reactive × 12
- 4.1.0.171 × 11
- monads × 11
- opinion × 10
- 4.0.190.100-rc × 9
- deployment × 9
- fixed × 9
- formlets × 9
- in × 9
- json × 9
- plugin × 9
- proposal × 9
- scheme × 9
- solid × 9
- basics × 8
- concurrent × 8
- highcharts × 8
- how-to × 8
- python × 8
- 4.1.1.175 × 7
- complexity × 7
- documentation × 7
- visual studio × 7
- 4.1.2.178 × 6
- lisp × 6
- real-world × 6
- released in 4.0.192.103-rc × 6
- remoting × 6
- resources × 6
- scala × 6
- websharper ui.next × 6
- workshop × 6
- xaml × 6
- 4.0.193.110 × 5
- 4.2.3.236 × 5
- aspnetmvc × 5
- authentication × 5
- azure × 5
- bootstrap × 5
- conference × 5
- dsl × 5
- formlet × 5
- java × 5
- list × 5
- metaprogramming × 5
- ml × 5
- released in Zafir.4.0.188.91-beta10 × 5
- sql × 5
- visualstudio × 5
- websharper.forms × 5
- zafir × 5
- 4.0.192.106 × 4
- 4.0.195.127 × 4
- 4.1.0.38 × 4
- 4.2.1.86 × 4
- 4.2.6.118 × 4
- css × 4
- example × 4
- extensions × 4
- fsi × 4
- fsx × 4
- html5 × 4
- jqueryui × 4
- lift × 4
- reflection × 4
- remote × 4
- rest × 4
- spa × 4
- teaching × 4
- template × 4
- websocket × 4
- wontfix × 4
- 4.0.196.147 × 3
- 4.1.0.34 × 3
- 4.1.6.207 × 3
- 4.2.1.223-beta × 3
- 4.2.11.258 × 3
- 4.2.4.114 × 3
- 4.2.4.247 × 3
- 4.2.5.115 × 3
- 4.2.6.253 × 3
- 4.2.9.256 × 3
- ajax × 3
- alt.net × 3
- aml × 3
- asp.net mvc × 3
- canvas × 3
- cloudsharper × 3
- compilation × 3
- database × 3
- erlang × 3
- events × 3
- extension × 3
- file upload × 3
- forums × 3
- inline × 3
- issue × 3
- kendo × 3
- macro × 3
- mono × 3
- msbuild × 3
- mvc × 3
- pattern × 3
- piglet × 3
- released in Zafir.4.0.187.90-beta10 × 3
- svg × 3
- type provider × 3
- view × 3
- 4.1.1.64 × 2
- 4.1.5.203 × 2
- 4.1.7.232 × 2
- 4.2.10.257 × 2
- 4.2.3.111 × 2
- 4.2.5.249 × 2
- android × 2
- asp.net × 2
- beginner × 2
- blog × 2
- chart × 2
- client × 2
- client server app × 2
- clojure × 2
- computation expressions × 2
- constructor × 2
- corporate × 2
- courses × 2
- cufp × 2
- d3 × 2
- debugging × 2
- direct × 2
- discriminated union × 2
- docs × 2
- elm × 2
- endpoint × 2
- endpoints × 2
- enterprise × 2
- entity framework × 2
- event × 2
- f# interactive × 2
- fable × 2
- flowlet × 2
- formdata × 2
- forms × 2
- fsc × 2
- google maps × 2
- hosting × 2
- http × 2
- https × 2
- iis 8.0 × 2
- install × 2
- interactive × 2
- interface × 2
- iphone × 2
- iteratee × 2
- jobs × 2
- jquery mobile × 2
- keynote × 2
- lens × 2
- lenses × 2
- linux × 2
- listmodel × 2
- mac × 2
- numeric × 2
- oauth × 2
- obfuscation × 2
- offline × 2
- oop × 2
- osx × 2
- packaging × 2
- pattern matching × 2
- performance × 2
- pipelines × 2
- q&a × 2
- quotation × 2
- reference × 2
- released in Zafir.4.0.185.88-beta10 × 2
- rx × 2
- script × 2
- security × 2
- self host × 2
- seq × 2
- sockets × 2
- stm × 2
- tcp × 2
- trie × 2
- tutorials × 2
- type × 2
- url × 2
- var × 2
- websharper.charting × 2
- websharper4 × 2
- websockets × 2
- wig × 2
- xna × 2
- zh × 2
- .net interop × 1
- 2012 × 1
- 4.0.194.126 × 1
- 4.1.3.184 × 1
- 4.1.4.189 × 1
- 4.2.0.214-beta × 1
- 4.2.12.259 × 1
- 4.2.2.231-beta × 1
- 4.2.8.255 × 1
- Canvas Sample Example × 1
- DynamicStyle Animated Style × 1
- Fixed in 4.0.190.100-rc × 1
- Released in Zafir.UI.Next.4.0.169.79-beta10 × 1
- SvgDynamicAttribute × 1
- WebComponent × 1
- abstract class × 1
- accumulator × 1
- active pattern × 1
- actor × 1
- addin × 1
- agents × 1
- aggregation × 1
- agile × 1
- alter session × 1
- animation × 1
- anonymous object × 1
- apache × 1
- api × 1
- appcelerator × 1
- architecture × 1
- array × 1
- arrays × 1
- asp.net 4.5 × 1
- asp.net core × 1
- asp.net integration × 1
- asp.net mvc 4 × 1
- asp.net web api × 1
- aspnet × 1
- ast × 1
- attributes × 1
- authorization × 1
- b-tree × 1
- back button × 1
- badimageformatexception × 1
- bash script × 1
- batching × 1
- binding-vars × 1
- bistro × 1
- body × 1
- bundle × 1
- camtasia studio × 1
- cas protocol × 1
- charts × 1
- clarity × 1
- class × 1
- cli × 1
- clipboard × 1
- clojurescript × 1
- closures × 1
- cloud × 1
- cms × 1
- coding diacritics × 1
- color highlighting × 1
- color zones × 1
- combinator × 1
- combinators × 1
- compile × 1
- compile code on server × 1
- config × 1
- confirm × 1
- content × 1
- context × 1
- context.usersession × 1
- continuation-passing style × 1
- coords × 1
- cordova × 1
- cors × 1
- coursera × 1
- cross-domain × 1
- csla × 1
- current_schema × 1
- custom content × 1
- data × 1
- data grid × 1
- datetime × 1
- debug × 1
- declarative × 1
- delete × 1
- devexpress × 1
- dhtmlx × 1
- dictionary × 1
- directattribute × 1
- disqus × 1
- distance × 1
- do binding × 1
- doc elt ui.next upgrade × 1
- docker × 1
- dojo × 1
- dol × 1
- dom × 1
- domain × 1
- du × 1
- duf-101 × 1
- dynamic × 1
- eastern language × 1
- eclipse × 1
- edsl × 1
- em algorithm × 1
- emacs × 1
- emotion × 1
- enums × 1
- error × 1
- etw × 1
- euclidean × 1
- eventhandlerlist × 1
- examples × 1
- ext js × 1
- extension methods × 1
- extra × 1
- facet pattern × 1
- failed to translate × 1
- fake × 1
- fantomas × 1
- fear × 1
- float × 1
- form × 1
- form-data × 1
- forum × 1
- fp × 1
- frank × 1
- fsdoc × 1
- fsharp × 1
- fsharp.core × 1
- fsharp.powerpack × 1
- fsharpx × 1
- fsunit × 1
- function × 1
- functional style × 1
- game × 1
- games × 1
- gc × 1
- generic × 1
- geometry × 1
- getlastwin32error × 1
- getting-started × 1
- google × 1
- google.maps × 1
- grid × 1
- group × 1
- guide × 1
- hash × 1
- headers × 1
- hello world example × 1
- heroku × 1
- highchart × 1
- history × 1
- how to × 1
- html-templating × 1
- http405 × 1
- httpcontext × 1
- hubfs × 1
- i18n × 1
- ie 8 × 1
- if-doc × 1
- iis × 1
- image × 1
- images × 1
- inheritance × 1
- initialize × 1
- input × 1
- install "visual studio" × 1
- installer × 1
- int64 × 1
- interfaces × 1
- internet explorer × 1
- interop × 1
- interpreter × 1
- io × 1
- iobservable × 1
- ios × 1
- iot × 1
- ipad × 1
- isomorphic × 1
- javascript optimization × 1
- javascript semanticui resources × 1
- jquery-plugin × 1
- jquery-ui × 1
- jquery-ui-datepicker × 1
- js × 1
- kendo datasource × 1
- kendochart × 1
- kendoui compiler × 1
- knockout × 1
- l10n × 1
- learning × 1
- library × 1
- libs × 1
- license × 1
- licensing × 1
- lineserieszonescfg × 1
- local setting × 1
- localization × 1
- logging × 1
- loop × 1
- macros × 1
- mailboxprocessor × 1
- mapping × 1
- maps × 1
- markerclusterer × 1
- markup × 1
- marshal × 1
- math × 1
- mathjax × 1
- message × 1
- message passing × 1
- message-passing × 1
- meta × 1
- metro style × 1
- micro orm × 1
- minimum-requirements × 1
- mix × 1
- mobile installation × 1
- mod_mono × 1
- modal × 1
- module × 1
- mouseevent × 1
- mouseposition × 1
- multidimensional × 1
- multiline × 1
- multithreading × 1
- mysql × 1
- mysqlclient × 1
- nancy × 1
- native × 1
- nested × 1
- nested loops × 1
- node × 1
- nunit × 1
- object relation mapper × 1
- object-oriented × 1
- om × 1
- onboarding × 1
- onclick × 1
- optimization × 1
- option × 1
- orm × 1
- os x × 1
- output-path × 1
- override × 1
- paper × 1
- parameter × 1
- persistence × 1
- persistent data structure × 1
- phonegap × 1
- pola × 1
- post × 1
- powerpack × 1
- prefix tree × 1
- principle of least authority × 1
- privacy × 1
- private × 1
- profile × 1
- programming × 1
- project × 1
- project euler × 1
- projekt_feladat × 1
- protected × 1
- provider × 1
- proxy × 1
- ptvs × 1
- public × 1
- pure f# × 1
- purescript × 1
- qna × 1
- quant × 1
- query sitelet × 1
- question × 1
- quotations × 1
- range × 1
- raphael × 1
- razor × 1
- rc × 1
- reactjs × 1
- real-time × 1
- ref × 1
- region × 1
- released in 4.0.190.100-rc × 1
- reporting × 1
- responsive design × 1
- rest api × 1
- rest sitelet × 1
- restful × 1
- round table × 1
- router × 1
- routing × 1
- rpc reverseproxy × 1
- runtime × 1
- sales × 1
- sample × 1
- sampleapp × 1
- scriptcs × 1
- scripting × 1
- search × 1
- self hosted × 1
- semanticui × 1
- sequence × 1
- serialisation × 1
- service × 1
- session-state × 1
- sharepoint × 1
- signals × 1
- sitelet website × 1
- sitelet.protect × 1
- sitlets × 1
- slickgrid × 1
- source code × 1
- sqlentityconnection × 1
- ssl × 1
- standards × 1
- static content × 1
- stickynotes × 1
- streamreader × 1
- stress × 1
- strong name × 1
- structures × 1
- submitbutton × 1
- subscribe × 1
- svg example html5 websharper.ui.next × 1
- sweetalert × 1
- system.datetime × 1
- system.reflection.targetinvocationexception × 1
- table storage × 1
- targets × 1
- tdd × 1
- templates ui.next × 1
- templating × 1
- text parsing × 1
- three.js × 1
- time travel × 1
- tls × 1
- tooltip × 1
- tracing × 1
- tsunamiide × 1
- turkish × 1
- twitter-bootstrap × 1
- type erasure × 1
- type inference × 1
- type providers × 1
- type-providers × 1
- typeprovider × 1
- ui next forms × 1
- ui-next × 1
- ui.next jqueryui × 1
- ui.next charting × 1
- ui.next formlets × 1
- ui.next forms × 1
- ui.next suave visualstudio × 1
- ui.next templating × 1
- unicode × 1
- unittest client × 1
- upload × 1
- usersession × 1
- validation × 1
- vb × 1
- vb.net × 1
- vector × 1
- view.map × 1
- visal studio × 1
- visual f# × 1
- visual studio 11 × 1
- visual studio 2012 × 1
- visual studio shell × 1
- vs2017 compiler zafir × 1
- vsix × 1
- web api × 1
- web-scraping × 1
- webapi × 1
- webcomponents × 1
- webforms × 1
- webgl × 1
- webrtc × 1
- webshaper × 1
- websharper async × 1
- websharper codemirror × 1
- websharper f# google × 1
- websharper forms × 1
- websharper reactive × 1
- websharper rpc × 1
- websharper sitelets routing × 1
- websharper warp × 1
- websharper-interface-generator × 1
- websharper.chartsjs × 1
- websharper.com × 1
- websharper.exe × 1
- websharper.owin × 1
- websharper.ui.next × 1
- websharper.ui.next jquery × 1
- websockets iis × 1
- why-websharper × 1
- windows 7 × 1
- windows 8 × 1
- windows-phone × 1
- winrt × 1
- www.grabbitmedia.com × 1
- xamarin × 1
- xml × 1
- yeoman × 1
- yield × 1
- zafir beta × 1
- zafir websharper4 × 1
- zarovizsga × 1
![]() |
Copyright (c) 2011-2012 IntelliFactory. All rights reserved. Home | Products | Consulting | Trainings | Blogs | Jobs | Contact Us | Terms of Use | Privacy Policy | Cookie Policy |
Built with WebSharper |
Hello!
I want to write a function to get
the records from one data table in SQL Server database. But I want it to be general, so it can get
the records from one table, but it can also get the data from another table. I want to put the result into an array of
tuples, so I can use it later on.
Now, begin the process with a simple
data table with only 2 fields:
CREATE TABLE [dbo].[Table1] (
[Field1] [int] NOT NULL ,
[Field2] [nvarchar] (1) NOT NULL
CONSTRAINT PK_Table1 PRIMARY KEY(Field1));
GO
Also, I provided some data in the
table:
INSERT INTO Table1 VALUES(1, 'A')
INSERT INTO Table1 VALUES(2, 'B')
I have some code, but it is not
working.
let
sql_ConnDB = "server=(local);Integrated
Security=True;Database=localDB"
let
connDB = new SqlConnection(sql_ConnDB)
let
GetTable1 field1 field2 =
use connDB = new
SqlConnection(sql_ConnDB)
use cmd = new
SqlCommand(""SELECT Field1,
Field2 FROM Table1", connDB)
cmd.CommandType
<- CommandType.StoredProcedure
cmd.Parameters.Add(SqlParameter("@Field1",
field1)) |> ignore
cmd.Parameters.Add(SqlParameter("@Field2",
field2)) |> ignore
connDB.Open()
let list = new
ResizeArray<_>()
use reader = cmd.ExecuteReader()
while (reader.Read()) do
list.Add({ field1 = unbox (reader.get_Item("Field1"))
field2 = unbox (reader.get_Item("Field2"))
})
// Return the created collection
list
let
sqlGet = GetTable1 field1 field2
I want the result saved in sqlGet =
[|(1,’A’);(2,’B’)|]
But I got the error message: “The
record label 'field1' is not defined” for the first “unbox” statement, if I
deleted field1, then field2 is not defined.
If some one knows how to do it, please show me your code.
Beside, if the table has 3 fields, what I can do then?
Thanks and happy new year!