I am using, from time to time, Basic4android VERSION 3.20. I AM NOT EXPERT!
When i need insert to a sql server database, or make a query to it, i use the PARSER.ASPX model, that i found here in forum, and works great.
My questions are:
- how can i send and jpg image, from the cell phone to my sql server? can i use something like ...parser.aspx?query=INSERT INTO MYTABLE....... in some way?
- what about "parser.aspx" model, do you think its too old? there is some easiest way in B4A 3.20 to conect to ms sql server, i meant something as "Dim Cn as conection... dim Rs as recordset"?
Please excuse my English too. A messy code from a very old application you can find below. Main idea is to convert binary image to string and then to parse it to web services (this part of code is not here but I understand you know how to do it). There is a problem: parsing as string parameter have size limitation; basically is something added to a internet address. Not bad but not perfect at all.
1st code extract image from camera and create a tem file
2nd code convert file to string
missing code of calling web services
3rd code is from web services (visual basic); convert back string to image. I send all parameters as one concatenated by "~".
Good luck.
P.S. Now my solution looks different because using MS SQL express edition (in my case) is not ok if you want to store big picture because of db size limitation. I just upload file with name identically with id of linked entity. Simple. For SQL 2008 and higher, standard and higher, you can use much more Pro SQL filestream.
B4X:
Camera1.StartPreview
out = File.OpenOutput(File.DirRootExternal, "tmp.jpg", False)
out.WriteBytes(Data, 0, Data.Length)
out.Close
b = ResizeBitmap(LoadBitmap(File.DirRootExternal, "tmp.jpg"), 320, 240) ' size
out = File.OpenOutput(File.DirRootExternal, index & ".jpg", False)
b.WriteToStream(out, 100 , "JPEG")
out.Close
B4X:
Sub WriteAsText(NumeFisier As String)
Log(NumeFisier)
Dim In As InputStream
In = File.OpenInput(File.DirRootExternal, NumeFisier & ".jpg")
Dim out As OutputStream
out.InitializeToBytesArray(10000)
File.Copy2(In, out)
Dim data() As Byte
data = out.ToBytesArray
Dim su As StringUtils
Dim PhotoAsString As String
Dim url, encodedUrl As String
encodedUrl = su.EncodeUrl(su.EncodeBase64(data), "UTF8")
PhotoAsString = encodedUrl
Dim dataLenght As Int=data.Length
InsertUsingWebServices(PhotoAsString)
End Sub
B4X:
<WebMethod()>
<ScriptMethod(UseHttpGet:=True)> _
Public Function PRB_InsertCopieCI(PublicKey As String) As String
Dim parts As String() = PublicKey.Split(New Char() {"~"c})
If GetID_Device(parts(0)) = 0 Then
Return "ERR"
Exit Function
End If
Dim id_transact As Integer
Dim PozaAsString As String
Dim id_Comanda As Integer = CInt(parts(1))
PozaAsString = CStr(parts(2))
Dim command As SqlCommand
Dim conn As New SqlConnection(connStringOAA)
Dim da As SqlDataAdapter = Nothing
Dim ds As DataSet = Nothing
Dim binaryData() As Byte
Try
binaryData = System.Convert.FromBase64String(PozaAsString)
Catch ex As Exception
Log(ex.ToString)
End Try
conn.Open()
Try
command = New SqlCommand("PRB_InsertCopieCI", conn)
command.CommandType = CommandType.StoredProcedure
command.Parameters.AddWithValue("@id_Comanda", id_Comanda)
command.Parameters.AddWithValue("@CopieCI", binaryData)
command.ExecuteNonQuery().ToString()
id_transact = Convert.ToInt32(command.ExecuteNonQuery())
Catch ex As Exception
Log(ex.ToString)
Finally
command = Nothing
conn.Close()
End Try
Return id_transact
End Function
Thank you bobi, i will take a look at your code...
Something that i dont say, is that if i can upload the jpg file, with some name related to primary key, its ok form me! Maybe HttpJob.PostFile?
I meant, if i have a record with primary key "1" and i can upload file named "1.jpg" to a folder on server (not to a field of a table) its ok for my.