|
I have the following codes which works fine.
Dim strText As String = ("อาหามะ กาเจ")
Dim strData As String
Dim byteArray() As Byte
byteArray = Encoding.GetEncoding(874).GetBytes(strText)
'>> 874 is Thai Code Page
strData = Encoding.Default.GetString(byteArray)
'>> strData contains "ÍÒËÒÁÐ ¡Òà¨"
strText = ("عمر الحاج الحضرى")
byteArray = Encoding.GetEncoding(1256).GetBytes(strText)
'>> 1256 is Arabic Code Page
strData = Encoding.Default.GetString(byteArray)
'>> strData contains "ÚãÑ ÇáÍÇÌ ÇáÍÖÑì"
My problem is that the content strText will be read from a
database table field which could be in Thai or Arabic. How
can I determine to use the right copde page in the below VB
statement
Encoding.GetEncoding(1256).GetBytes(strText)
Would appreciate some can help.
|
|
|
|
|
You would need to analyse every character in the string, and even then it may not be 100% certain. You need some other information with the data that tells you what language it is.
|
|
|
|
|
You'll need to save the code page in a separate column next to the VARCHAR, or turn that into an NVARCHAR. You can't "determine" the codepage from a random string of bytes.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Why MemoryStream object uses double the memory?
For example, whether the capacity of MemoryStream is 1GB in Task Manager I see that is consuming 2GB.
Module Module1
Sub Main()
Dim ObjMemoryStream As System.IO.MemoryStream
ObjMemoryStream = New System.IO.MemoryStream()
System.Console.WriteLine("Capacity: {0}", ObjMemoryStream.Capacity.ToString())
System.Console.WriteLine("Length: {0}", ObjMemoryStream.Length.ToString())
Dim j As Integer
For i As Integer = 0 To 1073741824 Step 1
If (i Mod 256) = 0 Then j = 0 Else j = i Mod 256
ObjMemoryStream.WriteByte(j)
Next i
System.Console.WriteLine("Length: {0}", ObjMemoryStream.Length.ToString())
Dim ObjFileStream As System.IO.FileStream
ObjFileStream = System.IO.File.Create("C:\TEST.TXT", 1024)
Dim ObjBinaryWriter As System.IO.BinaryWriter
ObjBinaryWriter = New System.IO.BinaryWriter(ObjFileStream, System.Text.Encoding.ASCII)
ObjMemoryStream.Position = 0
ObjBinaryWriter.Write(ObjMemoryStream.ToArray())
ObjBinaryWriter.Flush()
ObjBinaryWriter.Close()
System.Console.ReadKey()
End Sub
End Module
|
|
|
|
|
First of all, you don't see the MemoryStream in isolation as far as memory consumption goes. There's the rest of the program, including all the assemblies that get loaded in - they all take up memory. Secondly, don't rely on Task Manager to determine memory profile. Task manager is a notoriously poor way of judging memory usage. Part of the reason for this is that .NET grabs more memory than it needs - this is to give the application room "to grow into" as it runs. Memory allocation is an expensive operation, so having your application grab just the bytes it needs while it's running would be a waste of time.
|
|
|
|
|
That's how much memory the MemoryStream has set aside for use. Since you didn't specify a capacity, it starts off with 256 bytes by default. As the stream is used and the current capacity is exceeded, it reallocates it's internal buffer and sets a new size larger than the current capacity. That new size is always twice the last size it used.
Arrays in .NET are immutable. Once created, you cannot change the size of an array. That limitation applies to everything in the .NET Framework, including the buffer used by MemoryStream. In order to increase the size, a new array of some size must be created and all the elements of the previous array copied to it, then the previous array is destroyed.
|
|
|
|
|
I think that object are storing the the data using two memory byte, please check the next example:
Module Module1
Sub Main()
Dim ObjMemoryStream As System.IO.MemoryStream
ObjMemoryStream = New System.IO.MemoryStream(1073741825)
System.Console.WriteLine("Capacity: {0}", ObjMemoryStream.Capacity.ToString())
System.Console.WriteLine("Length: {0}", ObjMemoryStream.Length.ToString())
Dim j As Integer
For i As Integer = 0 To 1073741824 Step 1
If (i Mod 256) = 0 Then j = 0 Else j = i Mod 256
ObjMemoryStream.WriteByte(j)
Next i
System.Console.WriteLine("Capacity: {0}", ObjMemoryStream.Capacity.ToString())
System.Console.WriteLine("Length: {0}", ObjMemoryStream.Length.ToString())
Dim ObjFileStream As System.IO.FileStream
ObjFileStream = System.IO.File.Create("C:\TEST.txt", 1024)
Dim ObjBinaryWriter As System.IO.BinaryWriter
ObjBinaryWriter = New System.IO.BinaryWriter(ObjFileStream, System.Text.Encoding.ASCII)
ObjMemoryStream.Position = 0
ObjBinaryWriter.Write(ObjMemoryStream.ToArray())
ObjBinaryWriter.Flush()
ObjBinaryWriter.Close()
System.Console.ReadKey()
End Sub
End Module
|
|
|
|
|
No, it's not. What you're storing is irrelevant. If you keep exceeding the capacity of the MemoryStream, it will keep allocating new arrays, twice as large as the last, until it can't grow any more (2GB).
These are the sizes the MemoryStream went through after you created it and keep adding more and more data to it:
256
512
1024
2048
4096
8192
16384
32768
65536
131072
262144
524288
1048576
2097152
4194304
8388608
16777216
33554432
67108864
134217728
268435456
536870912
1073741824
2147483648
Oh, look at that. It managed to hit 2GB in size right after you added 1073741824 bytes of information to it. It's allocating bigger and bigger blocks of memory because it has no way of knowing how big to make the array to that it fits your data perfectly.
If you want to keep it from getting to 2GB of memory, allocate the MemoryStream with the expected size as a parameter, say 1.5GB:
Dim ms As New MemoryStream(1610612736)
Now, if you exceed that, the MemoryStream will try to reallocate itself using twice the size you initially specified and that will lead to an OutOfMemory exception.
You can NOT look in Task Manager to see how much memory your app is using. It's telling you how much memory the .NET CLR as RESERVED for your app. This will always be larger than what your app is actually using.
|
|
|
|
|
Thank you very mush.
|
|
|
|
|
I assume you're looking at the process size when you hit the ReadKey().
Your ObjMemoryStream will be 1GB + 1 byte big (you start from 0).
Then you evaluate ObjMemoryStream.ToArray(). That will create an array (Help: "This method returns a copy of the contents of the MemoryStream as a byte array"), also of size 1GB-odd. (You don't know when .NET will garbage-collect that, and process sizes often don't shrink anyway.)
Don't convert your memory stream to an array! Try something like ObjMemoryStream.CopyTo() instead.
|
|
|
|
|
Can anyone help me to develope Gantt chart in resources view type. I want to show the various task assign to employee in a particular duration. Please share me code for the same.
-Angel
|
|
|
|
|
Can anyone suggest how to work with asp.net membership configuration and database?
|
|
|
|
|
|
Im no sure if im in the correct discussion but im am trying to create a stupid and simple project. i have create a database and i connected it with VB. i have create a menustrip with "table" and "data".
the "table" has a sub-menu that says "Inventory show" and "Customer_Information show". When you click on the "Inventory show" in the sub-menu...how do you write the code to show only "Inventory" (from the database) in the form? sorry if i explained confusing, my english is off a little bit.
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me._02_Customer_InformationTableAdapter.Fill(Me.GradebookDataSet._02_Customer_Information)
Me._01_InventoryTableAdapter.Fill(Me.GradebookDataSet._01_Inventory)
End Sub
Private Sub InventoryToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles InventoryToolStripMenuItem.Click
End Sub
Private Sub Customer_InformationToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles InventoryToolStripMenuItem.Click
End Sub
Private Sub ExitToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExitToolStripMenuItem.Click
End
End Sub
End Class
|
|
|
|
|
CaseLost wrote: Depends on what you want to do with that data. If you have a datagridview, you could load the data and assign it to it's datasource-property.
CaseLost wrote: how do you write the code to show only "Inventory" (from the database) in the
form? Not so fast; you'll need something to display it ON; a form, a grid, labels. Then you'll need to load your data (using SQL, restricting the data using a WHERE clause). After that, you can put your data on that form and display it.
If you haven't displayed anything from a database before, I suggest you put this project on hold and try some examples first. There's an example here[^]
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Hello guys.i need help with this query. i am not very good at this kind of query.
wh is wrong with it? missing ant ) or ' ?
Hereis my code:
strsql = "update membercars set "
strsql = strsql & "make= '" & txtmake.Text & "', "
strsql = strsql & "model= '" & txtmodel.Text & "', "
strsql = strsql & "color= '" & txtcolor.Text & "', "
strsql = strsql & "tag= '" & txttag.Text & "', "
strsql = strsql & "memberid= " & Val(txtserial.Text) & " where serial = " & Val(txtcarserial.Text)
strsql = strsql & " and serial = " & Val(txtserial.Text) & ") "
|
|
|
|
|
EVERYTHING is wrong with it.
Google for "SQL Injection attack" to find out why what you're doing is wrong and then Google for "C# parameterized queries" for all kinds of examples on how to build your query without using string concatenation.
Oh, and you have a closing ")", but no opening "(".
|
|
|
|
|
|
Here's another SQL Injection reference, in case you weren't convinced by the other messages:
http://www.troyhunt.com/2013/07/everything-you-wanted-to-know-about-sql.html[^]
To fix your code:
command.CommandText = "update membercars set make = @make, model = @model, color = @color, tag = @tag, memberid = @memberid where serial = @serial";
command.Parameters.AddWithValue("@make", txtmake.Text)
command.Parameters.AddWithValue("@model", txtmodel.Text)
command.Parameters.AddWithValue("@color", txtcolor.Text)
command.Parameters.AddWithValue("@tag", txttag.Text)
command.Parameters.AddWithValue("@memberid", txtserial.Text)
command.Parameters.AddWithValue("@serial", txtcarserial.Text)
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
This is your query btw (changed layout for readabillity);
update membercars
set make= '1'
, model= 'super'
, color= 'green'
, tag= 'Youre it!'
, memberid= txtserial
where serial = txtcarserial
and serial = txtserial If txtcarserial and txtserial do not match, no records will be returned. The SQL query syntax is the same, regardless of the calling language.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Thank you so much guys. It worked and it's much easier than the method that i wrote before.
cmd.Connection = mcon
cmd.CommandText = "update membercars set make=@make, model=@model, color=@color, tag= @tag where memberid=@memberid;"
cmd.Parameters.AddWithValue("@make", txtmake.Text)
cmd.Parameters.AddWithValue("@model", txtmodel.Text)
cmd.Parameters.AddWithValue("@color", txtcolor.Text)
cmd.Parameters.AddWithValue("@tag", txttag.Text)
cmd.Parameters.AddWithValue("@memberid", txtserial.Text)
cmd.ExecuteNonQuery()
Just one more question. I am writing an insert query.
cmd.CommandText = "insert into membercars(make, model, plate, color, tag) values (@make, @model, @plate, @color, @tag) where memberid=@memberid;"
cmd.Parameters.AddWithValue("@make", txtmake.Text)
cmd.Parameters.AddWithValue("@model", txtmodel.Text)
cmd.Parameters.AddWithValue("@plate", txtplate.Text)
cmd.Parameters.AddWithValue("@color", txtcolor.Text)
cmd.Parameters.AddWithValue("@tag", txttag.Text)
cmd.Parameters.AddWithValue("@memberid", txtserial.Text)
cmd.ExecuteNonQuery()
it's giving me an eror: incorrect syntax near where. what's the error?
|
|
|
|
|
Member 10506215 wrote: what's the error? An INSERT does not contain a WHERE -clause. What would/should the "where" do? Syntax can be found here[^].
Get a good book on SQL; this looks like trial and error.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
i'll tell you the details.
i have 2 tables: members and membercars. i need to be able to add more than one car for one member. so i thought if i added the second car, and i put a condition--where memberid=txtserial.text--the memberid is for the membercars and the txtserial.text is the serial for a member(autincremented).
So any suggestions?
|
|
|
|
|
You can't use the "where" clause in an insert. The computer will simply not accept it, regardless of your intention. (Yes, it does accept it in a subselect, but that is not the case here)
CAR
carId
PERSON
personId
CAROWNERS
carId
personId
Or, with data;
CAR
12
14
167
PERSON
A
B
C
CAROWNERS
12, A
167, A
14, B
If you want to register a car to a person, insert a record into "CAROWNERS" containing both Id's.
Member 10506215 wrote: so i thought if i added the second car, and i put a condition That's not how it works; commands have a specific syntax, you don't make one up and assume it works.
Get a book on SQL. Get it today, before I see a question on joining those records back together.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Done
i need to add multiple cars for just one member. Here is my code for saving cars:
Dim cmd As New SqlCommand
cmd.Connection = mcon
cmd.CommandText = "insert into membercars(serial, memberid, make, model, plate, color, tag) values (@serial, @memberid, @make, @model, @plate, @color, @tag);"
cmd.Parameters.AddWithValue("@serial", txtserial.Text)
cmd.Parameters.AddWithValue("@memberid", txtserial.Text)
cmd.Parameters.AddWithValue("@make", txtmake.Text)
cmd.Parameters.AddWithValue("@model", txtmodel.Text)
cmd.Parameters.AddWithValue("@plate", txtplate.Text)
cmd.Parameters.AddWithValue("@color", txtcolor.Text)
cmd.Parameters.AddWithValue("@tag", txttag.Text)
cmd.ExecuteNonQuery()}
fillgrid()
And this for saving mambers:
cmd.Connection = mcon
strsql = "insert into members "
strsql = strsql & "(name, "
strsql = strsql & "familyname, "
strsql = strsql & "address, "
strsql = strsql & "mobile, "
strsql = strsql & "phone, "
strsql = strsql & "fax, "
strsql = strsql & "email, "
strsql = strsql & "space, "
strsql = strsql & "timezone, "
strsql = strsql & "website) "
strsql = strsql & "values ('" & txtname.Text & "', "
strsql = strsql & "'" & txtfamilyname.Text & "', "
strsql = strsql & "'" & txtaddress.Text & "', "
strsql = strsql & "'" & txtmobile.Text & "', "
strsql = strsql & "'" & txtphone.Text & "', "
strsql = strsql & "'" & txtfax.Text & "', "
strsql = strsql & "'" & txtemail.Text & "', "
strsql = strsql & "'" & txtspace.Text & "', "
strsql = strsql & Val(cmbtimezone.SelectedValue) & ", "
strsql = strsql & "'" & txtwebsite.Text & "') "
strsql += " SELECT IDENT_CURRENT('members')"
cmd.CommandText = strsql
txtsearch.Text = ""
txtserial.Text = cmd.ExecuteScalar().ToString()
Thank you for your replies
|
|
|
|
|